从 Json 数组中获取 Key 的值

Get the value of the Key from a Json Array

我有下面的 Json 数组,我需要获取“关系”对象中的键值。我怎么做?关系对象对于数组中的每个对象都有不同的键值对集。

[
    {
        "data": {
            "_hash": null,
            "kind": "ENTITY",
            "id": "test122",
            "payload": {
                "attributes": {
                    "bbl:27": false
                },
                "relations": {
                    "bbl:45": "P18",
                    "bbl:P18": "P562"
                },
                "type": [
                    "P185"
                ]
            }
        }
    }
]

在上面的内部关系中,键是“bbl:45”和“bbl:P18”。我需要这些值,特别是我需要提取 45 和 P18,考虑到 bbl 在关系对象中保持不变。我该怎么做。 Jarray中有多个对象,我只展示了一个。

对于动态键,您可以使用字典:

public class Root
{
     public Data data { get; set; }
}

public class Data
{
    public Payload payload { get; set; }
}

public class Payload
{
    public Dictionary<string, string> relations { get; set; }
}

var result = JsonConvert.DeserializeObject<List<Root>>(sourcejson);

接下来将包含所有键:

var keys = result
    .Select(r => r.data)
    .Select(r => r.payload)
    .SelectMany(r => r.relations.Keys)

或者使用 LINQ 来 JSON API:

var result = JsonConvert.DeserializeObject<JArray>(sourcejson);
var list = result
    .Children()
    .SelectMany(c => c["data"]["payload"]["relations"].Children<JProperty>())
    .Select(p => p.Name)
    .ToList(); // list is {"bbl:45", "bbl:P18"}

然后您可以根据需要处理键 - 例如使用 Split(':')"bbl:45" 转换为 "bbl" 和 `"45".

的数组

下面的代码解决了你的问题。

using Newtonsoft.Json.Linq;
using System;
using System.Linq;
using Json.Net;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string json = "{\"data\":{\"_hash\":null,\"kind\":\"ENTITY\",\"id\":\"test122\",\"payload\":{\"attributes\":{\"bbl:27\":false},\"relations\":{\"bbl:45\":\"P18\",\"bbl:P18\":\"P562\"},\"type\":[\"P185\"]}}}"; 

            JObject jsonObject = JObject.Parse(json);

            var results = jsonObject["data"]["payload"]["relations"];

            foreach (var item in results)
            {

                string propName = ((JProperty)item).Name;

                string requiredValue = propName.Split(':')[1];

                Console.WriteLine($"Required: {requiredValue} !");


               
            }

        }
    }
}

当 属性 名称不包含 :

时,您应该添加一些错误处理

我想提一下,如果您可以更改数据格式,请考虑这样做,将有效载荷作为成员专有名称的一部分是非常不寻常的,但您可以这样做:

    [Fact]
    public void DynamicJsonHandlingTest()
    {
        var serialized = "[{\"data\":{\"_hash\":null,\"kind\":\"ENTITY\",\"id\":\"test122\",\"payload\":{\"attributes\":{\"bbl:27\":false},\"relations\":{\"bbl:45\":\"P18\",\"bbl:P18\":\"P562\"},\"type\":[\"P185\"]}}}]";
        using var jDoc = JsonDocument.Parse(serialized);
        var enumerator = jDoc.RootElement.EnumerateArray();
        foreach(var JsonElement in enumerator)
        {
            var relationsElement = JsonElement.GetProperty("data").GetProperty("payload").GetProperty("relations");

            foreach (var ele in relationsElement.EnumerateObject())
            {
                var sought = ele.Name.Split(":")[1];
                //sought now cointains first 45 then P18
            }
        }
    }