我有一个人工编辑的 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" } });
}
关于c# - Json.NET更改值并保留注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35791920/