c# - Json.NET更改值并保留注释

标签 c# json json.net

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

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

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

最佳答案

保留注释是可能的,但格式化是另一回事,我不知道使用 Json.Net 执行此操作的正确方法,但是 JsonTextReaderLineNumber 和LinePosition 应该可以使用它们在一定程度上保留格式,但感觉很老套且脆弱,因此如果它不是很重要,我建议使用 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" } });
        }

关于c# - Json.NET更改值并保留注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35791920/

相关文章:

c# - 当我通过 jquery 发布时服务器验证不起作用

c# - 奇怪的错误(输入字符串的格式不正确。)

json - Graphx 中使用 Spark 的最短路径性能

c# - 序列化和反序列化不适用于字典作为支持字段

c# - 错误单元测试 webapi Controller

c# - 端口DDI登录密码加密到Metro

c# - 使用数据库优先方法的 WPF 中的 DataAnnotation - 如何将数据注释移动到好友类,包括。 IsValid 函数

javascript - 在 html div 上显示一个漂亮的 json ..可能吗?

javascript - JSON.stringify() 在解析对象时是否总是忽略方法?

c# - Json.NET StringEnumConverter 并不总是有效