是否可以在不更改格式的情况下修改JSON?

问题描述 投票:0回答:1

使用Newtonsoft.Json,您可以选择如何使用Formatting枚举和JsonTextWriter的属性来格式化JSON。但是,如果我从已经以某种方式格式化的JSON字符串开始并且想要修改它,是否有办法确保它保留其格式?

我可以想到一些探索途径:

  1. 当前的任何JSON库都可以在不反序列化的情况下修改JSON字符串吗?
  2. 反序列化JSON字符串时,是否有办法检测字符串的格式,以便在重新序列化时可以应用相同的格式?
  3. 是否有将反序列化的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));

((我知道除了选择IndentedNone以外,还有更多格式化JSON的方法,但是为了清楚起见,我将示例简化了。)

c# json json.net formatting indentation
1个回答
0
投票

我会争辩:这可能是徒劳的。

尽管它是人类可读的,但人类很少阅读。实际上,我更担心不小心将重要的内容解析到有效对象中或从中解析出来。

但是,在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,并且缩进或不缩进,我相信在以下前提下,这已经足够了:

  1. 我们控制来自客户端的格式更改
  2. 如果缩小,则格式更改为Newtonsoft的默认设置
  3. 假设上,它不会增长
  4. 如果转换使字符串长度相同,则没有任何变化
  5. 当然,出现问题的情况如下:

  1. 接收的JSON包含额外的字符:"First Name:",这在Json中有效,但在Class属性名称中无效,因此您可能需要担心一个属性。
  2. JSON仍然是一个字符串,可能会出现各种各样的怪异事物,因此以任何确定性进行验证都可能成为傻瓜竞赛(建立更好的傻瓜)
  3. 实际上,如果某些工具的目的是向人类展示数据:而不是选择最清晰的格式(我认为是紧缩格式)并始终显示该格式。

如果设计通常是机器,则对最小的有效负载不使用。我认为几乎所有习惯JSON的开发人员都希望最小化JSON作为有效载荷。

© www.soinside.com 2019 - 2024. All rights reserved.