Json.NET 更改值并保留注释

本文关键字:保留 注释 NET Json | 更新日期: 2023-09-27 18:37:15

我有一个人工编辑的JSON(配置文件),需要以编程方式更改值,但保留注释,也可以选择保留格式。Json.NET 可能吗?我有:

JToken jobject = JToken.Parse(json);
jobject["name"] = name;
json = jobject.ToString();

但它删除了所有注释并重新格式化了 JSON 字符串。

Json.NET 更改值并保留注释

保留

注释是可能的,但格式化是一个不同的故事,我不知道使用 Json.Net 的正确方法,但是JsonTextReaderLineNumberLinePosition,应该可以使用它们在一定程度上保留格式,但它感觉很笨拙和脆弱,因此如果它不是很重要,我建议使用 Json.Net 内部格式。

下面是更新属性和保留注释但不设置格式的示例。

        private static string Update(string json, object update)
        {
            var updateObj = JObject.Parse(JsonConvert.SerializeObject(update));
            var result = new StringWriter();
            var writer = new JsonTextWriter(result);
            writer.Formatting = Formatting.Indented;
            var reader = new JsonTextReader(new StringReader(json));
            while (reader.Read())
            {
                if (reader.Value == null)
                {
                    writer.WriteToken(reader.TokenType);
                    continue;
                }
                var token= 
                   reader.TokenType == JsonToken.Comment ||
                   reader.TokenType == JsonToken.PropertyName || 
                   string.IsNullOrEmpty(reader.Path)
                   ? null 
                   : updateObj.SelectToken(reader.Path);
                if (token == null)
                    writer.WriteToken(reader.TokenType, reader.Value);
                else
                    writer.WriteToken(reader.TokenType, token.ToObject(reader.ValueType));
            }
            return result.ToString();
        }
        static void Main(string[] args)
        {
            string json = @"{
   //broken
   'CPU': 'Intel',
   'PSU': '500W',
   'Drives': [
     'DVD read/writer'
     /*broken*/,
     '500 gigabyte hard drive',
     '200 gigabype hard drive'
   ]
}";
            var update=Update(json, new { CPU = "AMD", Drives = new[] { "120 gigabytes ssd" } });
        }