我正在尝试将字符串列表转换为 JSON 方括号"列表"的 JSON 文件更新。
我的字符串列表:
var animals = new List<string>() { "bird", "dog" };
使用此代码:
string json = File.ReadAllText(filePath);
dynamic jsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject(json);
var serializedObject = JsonConvert.SerializeObject(animals);
jsonObj["animals"] = serializedObject;
string output = Newtonsoft.Json.JsonConvert.SerializeObject(jsonObj, Newtonsoft.Json.Formatting.Indented);
File.WriteAllText(filePath, output);
旧的 JSON 文件:
{
"animals": ["cat", "fox"]
}
新的 JSON 文件应为:
{
"animals": ["bird", "dog"]
}
但我得到的是:
{
"animals": "["bird", "dog"]"
}
任何帮助不胜感激!
谢谢
你的serializedObject
是一个字符串,但你根本不需要它。
由于您不反序列化为具体类型,因此您的jsonObj["animals"]
只是一个JArray
。所以你需要这个:
dynamic jsonObj = JsonConvert.DeserializeObject(json);
jsonObj["animals"] = JArray.FromObject(animals);
现在,您可以通过 JsonConvert.SerializeObject
将其序列化回。
如果该jsonObj
是一个常规对象,则可以设置 animals
属性的值。如果它是一个 ExpandoObject,同样会起作用。 不过,JsonConvert.DeserializeObject(json)
会生成一个 Json.Net 类型,其数据必须是有效的 Json.NET 类型。
您可以将列表内容作为 JArray 进行断言,例如:
var animals = new List<string>() { "bird", "dog" };
dynamic jsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject("{'moo':1}");
jsonObj.animals= new JArray(animals);
var result=JsonConvert.SerializeObject(jsonObj);
result
将是:
{"moo":1,"animals":["bird","dog"]}
仅当文件包含 JSON 字典时,添加新属性才有效。如果您知道该文件将始终包含字典,则可以将反序列化结果强制转换为 JObject,并通过 JObject 的索引器添加新属性:
var jsonObj = (JObject)JsonConvert.DeserializeObject("{'moo':1}");
jsonObj["animals"]= new JArray(animals);