我正在尝试将已转换的字符串列表更新为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\"]"
}
感谢您的帮助!
谢谢
答案 0 :(得分:2)
您的serializedObject
是一个字符串,但是您根本不需要它。
因为您没有反序列化为具体类型,所以jsonObj["animals"]
只是JArray
。所以你需要这个:
dynamic jsonObj = JsonConvert.DeserializeObject(json);
jsonObj["animals"] = JArray.FromObject(animals);
现在您可以通过JsonConvert.SerializeObject
重新序列化它。
答案 1 :(得分:0)
如果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);