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