使用Newtonsoft.Json,您可以选择如何使用Formatting
枚举和JsonTextWriter
的属性来格式化JSON。但是,如果我从已经以某种方式格式化的JSON字符串开始并且想要修改它,是否有办法确保它保留其格式?
我可以想到一些探索途径:
JObject
与它所来自的JSON字符串相结合的函数,以便对象的更改被应用在旧字符串的顶部,而不是用于构建新的字符串?问题示例:
var obj = JObject.Parse(json);
obj["foo"] = "bar";
Console.WriteLine(obj.ToString(Formatting.Indented));
// {
// "baz": "qux",
// "foo": "bar"
// }
Console.WriteLine(obj.ToString(Formatting.None));
// {"baz":"qux","foo":"bar"}
// Not knowing how the input was formatted,
// how can I know what options to use?
解决方案可能看起来像:
var format = JsonConvert.GetFormat(json); // No such method?
var obj = JObject.Parse(json);
obj["foo"] = "bar";
Console.WriteLine(obj.ToString(format));
((我知道除了选择Indented
或None
以外,还有更多格式化JSON的方法,但是为了清楚起见,我将示例简化了。)
我会争辩:这可能是徒劳的。
尽管它是人类可读的,但人类很少阅读。实际上,我更担心不小心将重要的内容解析到有效对象中或从中解析出来。
但是,在Newtonsoft中有一点乐趣,如果在将原始文档缩进时将其格式化为不缩进,则可以使用此功能。>>
var person = new Person() { Name = "John", Colors = new List<string>() {"Red", "Blue","Green"} }; var rawJson = Newtonsoft.Json.JsonConvert.SerializeObject(person, Formatting.Indented); var newJson = Newtonsoft.Json.JsonConvert.SerializeObject(person, Formatting.None); var settings = new Newtonsoft.Json.JsonSerializerSettings(); settings.Formatting = (Formatting)(newJson.Length <= rawJson.Length ? 1 : 0); var finalJson = JsonConvert.SerializeObject(person, settings);
如果我们只关心Newtonsoft,并且缩进或不缩进,我相信在以下前提下,这已经足够了:
当然,出现问题的情况如下:
"First Name:"
,这在Json中有效,但在Class属性名称中无效,因此您可能需要担心一个属性。实际上,如果某些工具的目的是向人类展示数据:而不是选择最清晰的格式(我认为是紧缩格式)并始终显示该格式。
如果设计通常是机器,则对最小的有效负载不使用。我认为几乎所有习惯JSON的开发人员都希望最小化JSON作为有效载荷。