代码之家  ›  专栏  ›  技术社区  ›  ZZZSharePoint

从Json数组中获取Key的值

  •  0
  • ZZZSharePoint  · 技术社区  · 4 年前

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

    [
        {
            "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中有多个对象,我只展示了一个。

    1 回复  |  直到 4 年前
        1
  •  1
  •   T. Nielsen    4 年前

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

        [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
                }
            }
        }
    
        2
  •  1
  •   Ali Shan    4 年前

    以下代码解决了您的问题。

    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} !");
    
    
                   
                }
    
            }
        }
    }
    

    当属性名称不包含时,您应该添加一些错误处理 :

        3
  •  1
  •   Guru Stron    4 年前

    对于动态键,可以使用dictionary:

    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);
    

    然后next将包含所有密钥:

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

    或者使用LINQ to 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”。