无法向 Json 数组添加新元素

Cannot add new elements to Json Array

我有一个包含字典列表的配置 Json 文件。

{
  "Hardware": [
    {
      "Name": "name1",
      "Model": "model1"
    },
    {
      "Name": "name2",
      "Model": "model2"
    }
  ]
}

我正在使用 Newtonsoft 将这个 Json 导入到一个变量中。

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.IO;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        public JObject Parameters;

        public Form1()
        {
            InitializeComponent();
            using (StreamReader file = File.OpenText("../../configuration.json"))
            using (JsonTextReader reader = new JsonTextReader(file))
            {
                Parameters = (JObject)JToken.ReadFrom(reader);
            }
        }
    }
}

这似乎运作良好,我可以做如下事情:

`Parameters["Hardware"][0]["Name"].ToString()`   -> returns "name1"

现在,我有两个具有新名称和新模型的字符串变量(这些变量来自迭代 DataGridView 的循环,但这与问题无关)

string Name = "name3";
string Model = "model3";

根据这个问题 Creating JSON on the fly with JObject 我创建了一个包含这两个变量的 JToken,但我不确定如何将它们添加到 Parameters["Hardware"]

我创建了一个包含此名称和模型的新 JObject:

dynamic Aux = new JObject();
Aux.Name = "name3";
Aux.Model = "model3";

但如果我尝试这样做:

Parameters["Hardware"].Add(Aux);

它抱怨 JToken does not contain a definition for Add 我不确定为什么 Parameters["Hardware"] 是 JToken 而不是 JArray。

我试过做一些像 Hacky 这样的事情:

Parameters["Hardware"] = (JArray)Parameters["Hardware"];
Parameters["Hardware"].Add(Aux);

但是编译器仍然抱怨 Parameters["Hardware"] 是一个 JToken 并且不会让我编译。

这是一个非常基本的事情,所以我确定我可能做错了什么并且存在一个简单的解决方案,但我无法弄清楚。

最后我想要像

这样的参数["硬件"]
{
  "Hardware": [
    {
      "Name": "name1",
      "Model": "model1"
    },
    {
      "Name": "name2",
      "Model": "model2"
    },
    {
      "Name": "name3",
      "Model": "model3"
    }
  ]
}

所以我可以将其导出回 Json 文件。

到目前为止,我只需要从 Json 中读取数据或对其进行修改,效果很好,但现在我必须添加元素,这让我遇到了一些麻烦。

我很高兴改变我读取文件的方式,也许将它存储为 JObject 并不是最好的。因此,欢迎就如何最终得到包含添加元素的词典列表提出任何建议。

您收到该错误是因为 JObject indexer Parameters["Hardware"] is declared to return an object of type JToken:

public JToken this[
  string propertyName
] { get; set; }

JTokenJArrayJObjectJValue等的抽象基class,没有Add() 方法。你需要向下转换为 JArray,它确实有一个 Add() 方法,就像这样

((JArray)Parameters["Hardware"]).Add(Aux); 

由于 c# 是 并且索引器声明为 return JToken,因此您只能使用抽象基 class JToken 的方法。您必须向下转换为 JArray 才能使用 JArray 方法。

有关 LINQ to JSON 类型层次结构的讨论,请参阅

试试这个.. 它对我有用,只需使用 JObject class.

在 json 对象的最后一个元素之后添加它
using (StreamReader file = File.OpenText("../../configuration.json"))
            using (JsonTextReader reader = new JsonTextReader(file))
            {
                var Parameters = (JObject)JToken.ReadFrom(reader);
                dynamic Aux = new JObject();
                Aux.Name = "name3";
                Aux.Model = "model3";
                Parameters["Hardware"].Last.AddAfterSelf(Aux);
            }