在现有 JSON 值中添加列表
Add a list in an existing JSON value
所以我在下面调用了一个方法,其中我的参数是 json 这种类型的字符串
var jsonWithSearchData = await querySearchData(jsonOut);
json输出 ->
[
{
"data": {
"_hash": null,
"kind": "ENY",
"id": "t123",
"payload": {
"r:attributes": {
"lok:934": "@0|I"
},
"r:relations": {
"lok:1445": "15318",
"lok:8538": "08562"
},
"r:searchData": "",
"r:type": [
"5085"
]
},
"type": "EQT",
"version": "d06"
}
}
]
querySearchData()
returns 我两个列出了这样的东西:["P123","P124","P987"]
和 ["Ba123","KO817","Daaa112"]
我想将此列表添加到上面的 r:searchData
键中。 searchData
中的密钥,即 r:Porelation
和 ClassA
以及 ClassB
保持不变。所以我希望我的输入 Json 中的 searchData
最终变成这样。
"r:searchData": {
"r:Porelation":{
"ClassA": ["P123","P124","P987"],
"ClassB": ["Ba123","KO817","Daaa112"]
}
},
我该怎么做?我尝试了什么:
JArray jfinObject = JArray.Parse(jobjects);
jfinObject["r:searchData"]["r:relations"]["ClassA"] = JArray.Parse(ListofCode.ToString());
我得到以下错误:
System.Private.CoreLib: Exception while executing function: Function1.
Newtonsoft.Json: Accessed JArray values with invalid key value:
"r:searchData". Int32 array index expected.
有几种方法可以将 node/object/array 添加到现有的 json。
一种选择是使用 Linq-to-Json 建立正确的模型。
假设您的问题中描述了 json 字符串,下面的代码会将您想要的 json 添加到 r:searchData
节点:
var arr = JArray.Parse(json); // the json string
var payloadNode = arr[0]["data"]["payload"];
// use linq-to-json to create the correct object
var objectToAdd = new JObject(
new JProperty("r:Porelation",
new JObject(
new JProperty("r:ClassA", array1),
new JProperty("r:ClassB", array2))));
payloadNode["r:searchData"] = objectToAdd;
上面的 array1
和 array2
可能来自 linq 查询(或只是标准数组)。
// Output:
{
"data": {
"_hash": null,
"kind": "ENY",
"id": "t123",
"payload": {
"r:attributes": {
"lok:934": "@0|I"
},
"r:relations": {
"lok:1445": "15318",
"lok:8538": "08562"
},
"r:searchData": {
"r:Porelation": {
"r:ClassA": [
"P123",
"P456"
],
"r:ClassB": [
"Ba123",
"Ba456"
]
}
},
"r:type": [
"5085"
]
},
"type": "EQT",
"version": "d06"
}
}
另一种选择是从对象创建 json,这可以使用 JToken.FromObject()
来实现。但是,这仅在您具有对 C# 属性也有效的 属性 名称时才有效。因此,这不适用于您想要的 属性 名称,因为它们包含 C# 属性的无效字符,但它可能对其他人有帮助:
// create JToken with required data using anonymous type
var porelation = JToken.FromObject(new
{
ClassA = new[] { "P123", "P456" }, // replace with your arrays here
ClassB = new[] { "Ba123", "Ba456" } // and here
});
// create JObject and add to original array
var newObjectToAdd = new JObject(new JProperty("r:Porelation", porelation));
payloadNode["r:searchData"] = newObjectToAdd;
所以我在下面调用了一个方法,其中我的参数是 json 这种类型的字符串
var jsonWithSearchData = await querySearchData(jsonOut);
json输出 ->
[
{
"data": {
"_hash": null,
"kind": "ENY",
"id": "t123",
"payload": {
"r:attributes": {
"lok:934": "@0|I"
},
"r:relations": {
"lok:1445": "15318",
"lok:8538": "08562"
},
"r:searchData": "",
"r:type": [
"5085"
]
},
"type": "EQT",
"version": "d06"
}
}
]
querySearchData()
returns 我两个列出了这样的东西:["P123","P124","P987"]
和 ["Ba123","KO817","Daaa112"]
我想将此列表添加到上面的 r:searchData
键中。 searchData
中的密钥,即 r:Porelation
和 ClassA
以及 ClassB
保持不变。所以我希望我的输入 Json 中的 searchData
最终变成这样。
"r:searchData": {
"r:Porelation":{
"ClassA": ["P123","P124","P987"],
"ClassB": ["Ba123","KO817","Daaa112"]
}
},
我该怎么做?我尝试了什么:
JArray jfinObject = JArray.Parse(jobjects);
jfinObject["r:searchData"]["r:relations"]["ClassA"] = JArray.Parse(ListofCode.ToString());
我得到以下错误:
System.Private.CoreLib: Exception while executing function: Function1. Newtonsoft.Json: Accessed JArray values with invalid key value: "r:searchData". Int32 array index expected.
有几种方法可以将 node/object/array 添加到现有的 json。
一种选择是使用 Linq-to-Json 建立正确的模型。
假设您的问题中描述了 json 字符串,下面的代码会将您想要的 json 添加到 r:searchData
节点:
var arr = JArray.Parse(json); // the json string
var payloadNode = arr[0]["data"]["payload"];
// use linq-to-json to create the correct object
var objectToAdd = new JObject(
new JProperty("r:Porelation",
new JObject(
new JProperty("r:ClassA", array1),
new JProperty("r:ClassB", array2))));
payloadNode["r:searchData"] = objectToAdd;
上面的 array1
和 array2
可能来自 linq 查询(或只是标准数组)。
// Output:
{
"data": {
"_hash": null,
"kind": "ENY",
"id": "t123",
"payload": {
"r:attributes": {
"lok:934": "@0|I"
},
"r:relations": {
"lok:1445": "15318",
"lok:8538": "08562"
},
"r:searchData": {
"r:Porelation": {
"r:ClassA": [
"P123",
"P456"
],
"r:ClassB": [
"Ba123",
"Ba456"
]
}
},
"r:type": [
"5085"
]
},
"type": "EQT",
"version": "d06"
}
}
另一种选择是从对象创建 json,这可以使用 JToken.FromObject()
来实现。但是,这仅在您具有对 C# 属性也有效的 属性 名称时才有效。因此,这不适用于您想要的 属性 名称,因为它们包含 C# 属性的无效字符,但它可能对其他人有帮助:
// create JToken with required data using anonymous type
var porelation = JToken.FromObject(new
{
ClassA = new[] { "P123", "P456" }, // replace with your arrays here
ClassB = new[] { "Ba123", "Ba456" } // and here
});
// create JObject and add to original array
var newObjectToAdd = new JObject(new JProperty("r:Porelation", porelation));
payloadNode["r:searchData"] = newObjectToAdd;