在现有 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:PorelationClassA 以及 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;

上面的 array1array2 可能来自 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"
  }
}

Online demo


另一种选择是从对象创建 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;