使用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的方法,但是为了清楚起见,我将示例简化了。)
答案 0 :(得分:2)
我会争辩:这可能是徒劳的。
尽管它应该是人类可读的,但很少被人类阅读。实际上,我担心的是不小心将重要的内容解析到有效对象中或从中解析出来。
但是,在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作为有效载荷。