【问题标题】:JSON add node to an existing JObjectJSON 将节点添加到现有 JObject
【发布时间】:2020-10-06 18:54:59
【问题描述】:

我正在尝试将新节点添加到现有的 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));

Newtonsoft.Json.dll 中出现“System.ArgumentException”类型的未处理异常

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

我应该注意 MyObject 是实际的 ObservableCollection,如果这有影响的话

【问题讨论】:

  • 当您调用 JsonConvert.SerializeObject(MyObject) 时,此处的 MyObject 被序列化为字符串,因此此处的 NewNode 将自身呈现为引用的字符串。 :)

标签: c# json json.net


【解决方案1】:

你能试试这个吗?

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.FromObject 是您想要将您的集合转换为 JArray 时要查找的方法。在这种情况下,该段看起来像

mainJson.Add("NewNode", JArray.FromObject(obsColl));
File.WriteAllText("myfile.json", mainJson.ToString());

【讨论】:

  • 男人选择,奴隶服从!无论如何,请看上面的编辑。这将返回一个错误。
  • 哎呀。对不起伙计。不知道这是一个集合。坚持,稍等。不确定我是否可以通过手机正确输入代码段
【解决方案2】:
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
        }
    }
}

【讨论】:

    猜你喜欢
    • 2021-02-22
    • 2018-06-18
    • 1970-01-01
    • 2020-10-28
    • 2020-09-13
    • 2021-12-20
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多