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

C# Json.NET更改值并保留注释,c#,json,json.net,C#,Json,Json.net,我有一个人工编辑的JSON(配置文件),需要以编程方式更改一个值,但保留注释,也可以选择保留格式。有可能吗?我有: JToken jobject = JToken.Parse(json); jobject["name"] = name; json = jobject.ToString(); 但它会删除所有注释并重新格式化JSON字符串。保留注释是可能的,但格式化是另一回事,我不知道使用JSON.Net的正确方法,但是JsonTextReader有LineNumber和LinePosition,

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

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

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

保留注释是可能的,但格式化是另一回事,我不知道使用JSON.Net的正确方法,但是
JsonTextReader
LineNumber
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" } });
        }

我认为这是不可行的,布局信息(例如填充、无用空格)在反序列化中丢失。我想知道为什么这个文件可以手动和编程修改。@DannyChen格式并不是那么重要。不需要完全反序列化,例如保留评论。