我试图添加一个新节点到现有的JSON
JObject
,但是当我添加它的格式不正确。它在整个节点周围添加引号,并将放在适当的位置。
背景:我正在加载一个JSON
文件,做一些逻辑,然后添加一个节点回来。我想我可以这样做:
mainJson.Add("NewNode", JsonConvert.SerializeObject(MyObject));
File.WriteAllText("myfile.json", mainJson.ToString());
问题是这就是结果:
{
"JSONFile": [
{
"More": "Nodes",
"InThe": "File"
}
],
"Customers": "{"FirstName":"Mike","LastName":"Smith"},{"FirstName":"Jane","LastName":"Doe"}",
}
我知道我的JsonConvert.SerializeObject(MyObject)正在工作,如果我这样做:
string json = JsonConvert.SerializeObject(MyObject);
File.WriteAllText("myfile2.json" json);
结果如下:
[
{
"FirstName": "Mike",
"LastName": "Smith"
},
{
"FirstName": "Jane",
"LastName": "Doe"
}
]
我错过了什么?
编辑:关注@Swagata Prateek的评论;
mainJson.Add("Customers",JObject.FromObject(MyObject));
类型为"System"的未处理异常。
Newtonsoft.Json.dll中出现ArgumentException附加信息:对象序列化为数组。
我应该注意到MyObject是实际的ObservableCollection
,如果这有区别
你能试一下吗?
mainJson.Add("NewNode", JObject.FromObject(MyObject));
File.WriteAllText("myfile.json", mainJson.ToString());
当你做JsonConvert.SerializeObject(MyObject)
时,它序列化MyObject
,在这个过程中你得到一个字符串。
当你给mainJson.Add("NewNode", JsonConvert.SerializeObject(MyObject));
赋值时,你是在给NewNode
赋值一个字符串。这样就得到了一个带引号的字符串,表示序列化的MyObject
:
如果您想将集合转换为JArray,JArray.FromObject
是您想要查找的方法。在这种情况下,段看起来像
mainJson.Add("NewNode", JArray.FromObject(obsColl));
File.WriteAllText("myfile.json", mainJson.ToString());
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
JObject tempvar= JObject.Parse(@"{
'CPU': 'Intel',
'Drives': [
'DVD read/writer',
'500 gigabyte hard drive'
]
}");
string cpu = (string)tempvar["CPU"]; // Intel
string firstDrive = (string)tempvar["Drives"][0]; // DVD read/writer
IList<string> allDrives = tempvar["Drives"].Select(t => (string)t).ToList();
// DVD read/writer
// 500 gigabyte hard drive
tempvar["Drives"][0].AddAfterSelf("new node");
//tempvar json with new node
}
}
}