无法向 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; }
而JToken
是JArray
、JObject
、JValue
等的抽象基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);
}
我有一个包含字典列表的配置 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; }
而JToken
是JArray
、JObject
、JValue
等的抽象基class,没有Add()
方法。你需要向下转换为 JArray
,它确实有一个 Add()
方法,就像这样
((JArray)Parameters["Hardware"]).Add(Aux);
由于 c# 是 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);
}