JSON向现有JObject添加节点

6

我正在尝试向现有的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.ArgumentException'的异常,位于 Newtonsoft.Json.dll 中

附加信息:将对象序列化为数组。需要 JObject 实例。

值得注意的是,如果 MyObject 是实际的 ObservableCollection,那可能会有所不同。


1
当您调用JsonConvert.SerializeObject(MyObject)时,这里的MyObject被序列化为一个字符串,因此NewNode在这里呈现为一个带引号的字符串。 :) - Swagata Prateek
2个回答

7
请你试着使用这个,好吗?
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());

一个人选择自己的命运,而奴隶则顺从命运!无论如何,请查看上面的编辑。这里出现了一个错误。 - Xaphann
1
哎呀,对不起啊。我没想到那是一个集合。等一下,我不确定我能否在手机上正确地输入代码段。 - Swagata Prateek

1
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
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接