如何通过超级嵌套Json的键获取值

问题描述 投票:0回答:3
"_embedded": {
"cscaia:status_report": {
  "_links": {
    "self": {
      "title": "status_report",
      "name": "status_report",
      "href": "https://api.dxc-dev-aia.hub-1.dev.us.insurance.dxc.com/quotes/ID-mrMxY1Dg/status_report"
    },
    "type": {
      "href": "https://diaas-dev.gtaia-test-domain.net/std-dev-lux-13100/insurance/schemas/quotes/statusReportDocument"
    },
    "up": {
      "href": "https://api.dxc-dev-aia.hub-1.dev.us.insurance.dxc.com/quotes/ID-mrMxY1Dg"
    }
  },
  "consistent": false,
  "messages": [
    {
      "message": "Incomplete attribute",
      "context": [
        {
          "propertyNames": [
            "quote$distributor_id"
          ]
        }
      ],
      "severity": "error",
      "code": "incomplete_attr"
    }
  ]
}

}

[这里,我需要找出键“ severity”的值,但我不知道它的级别。我也没有嵌套它的父键的值,因为json始终是嵌套在其中的动态的。

我尝试使用扩展方法。但是对于嵌套键,我没有得到结果。

public static TType JsonValue<TType>(this JObject obj, string key)
    {
        object result = null; //default to null if nothing is found

        foreach (var item in obj)
        {
            var token = item;

            if (token.Key.Equals(key, StringComparison.InvariantCultureIgnoreCase))
            {
                result = token.Value.ToObject<TType>(); //return the value found
                break;
            }

            if (!obj[token.Key].Children().Any())
                continue;

            var jt = obj[token.Key].ToString();

            if (!jt.StartsWith("["))
            {
                result = JsonValue<TType>(JObject.Parse(jt), key);
            }
            else
            {
                obj[token.Key].Children().ToList().ForEach(x =>
                {
                    //only the first match will be returned
                    result = JsonValue<TType>(JObject.Parse(x.ToString()), key);
                });
            }

            if (result != null)
                break;
        }
        return (TType)result;
    }
javascript c# json linq
3个回答
1
投票

您可以采用递归方法,如果找到一个值,则返回。

function getValue(object, key) {
    var value;

    if (!object || typeof object !== 'object') return;
    if (key in object) return object[key];

    Object.values(object).some(v => {
        value = getValue(v, key)
        return value !== undefined;
    });    

    return value;
}

var data = { _embedded: { "cscaia:status_report": { _links: { self: { title: "status_report", name: "status_report", href: "https://api.dxc-dev-aia.hub-1.dev.us.insurance.dxc.com/quotes/ID-mrMxY1Dg/status_report" }, type: { href: "https://diaas-dev.gtaia-test-domain.net/std-dev-lux-13100/insurance/schemas/quotes/statusReportDocument" }, up: { href: "https://api.dxc-dev-aia.hub-1.dev.us.insurance.dxc.com/quotes/ID-mrMxY1Dg" } }, consistent: false, messages: [{ message: "Incomplete attribute", context: [{ propertyNames: ["quote$distributor_id"] }], severity: "error", code: "incomplete_attr" }] } } };

console.log(getValue(data, 'severity'));
console.log(getValue(data, 'href'));

0
投票

只需使用递归函数来遍历所有级别。

var _embedded = {
  "cscaia:status_report": {
    "_links": {
      "self": {
        "title": "status_report",
        "name": "status_report",
        "href": "https://api.dxc-dev-aia.hub-1.dev.us.insurance.dxc.com/quotes/ID-mrMxY1Dg/status_report"
      },
      "type": {
        "href": "https://diaas-dev.gtaia-test-domain.net/std-dev-lux-13100/insurance/schemas/quotes/statusReportDocument"
      },
      "up": {
        "href": "https://api.dxc-dev-aia.hub-1.dev.us.insurance.dxc.com/quotes/ID-mrMxY1Dg"
      }
    },
    "consistent": false,
    "messages": [
      {
        "message": "Incomplete attribute",
        "context": [
          {
            "propertyNames": [
              "quote$distributor_id"
            ]
          }
        ],
        "severity": "error",
        "code": "incomplete_attr"
      }
    ]
  }
}

function recursive_search (object) {

  let output = null;

  //check if object is an array or object
  if (Array.isArray (object)) {
  
    //check every array-element recursive
    for (let i in object)
      output = recursive_search (object[i])

  } else
  if (typeof object === 'object') {
  
    //get all keys of object
    let keys = Object.keys (object);
    
    //check every key if it is 'serverity'. if not check every property recursive 
    for (let i in keys)
      if (keys[i] === 'severity') {
      
        output = object[keys[i]];
        break;
      
      } else
      if (typeof object === 'object')
        output = recursive_search (object[keys[i]])
  
  }
  
  return output;

}

//get serverity
serverity = recursive_search (_embedded)

console.log ('serverity = ' + serverity);

0
投票

假设您要使用C#实现此目的,可以尝试使用Newtonsoft.Json.Linq查询所有后代,直到找到正确的属性。

这应该有效(demo):

public static string GetJsonPropertyValue(string json, string property)
{
    var parsedJson = JObject.Parse(json);
    return parsedJson.Descendants()
        .FirstOrDefault(t => t.Type == JTokenType.Property 
            && ((JProperty)t).Name == property)
        ?.First.Value<string>();
}

从您的示例:

static void Main(string[] args)
{
    var json = @"{
     ""_embedded"": {
        ""cscaia:status_report"": {
            ""_links"": {
                ""self"": {
                    ""title"": ""status_report"",
                    ""name"": ""status_report"",
                    ""href"": ""https://api.dxc-dev-aia.hub-1.dev.us.insurance.dxc.com/quotes/ID-mrMxY1Dg/status_report""
                },
                ""type"": {
                    ""href"": ""https://diaas-dev.gtaia-test-domain.net/std-dev-lux-13100/insurance/schemas/quotes/statusReportDocument""
                },
                ""up"": {
                    ""href"": ""https://api.dxc-dev-aia.hub-1.dev.us.insurance.dxc.com/quotes/ID-mrMxY1Dg""
                }
            },
            ""consistent"": false,
            ""messages"": [
                {
                    ""message"": ""Incomplete attribute"",
                    ""context"": [
                        {
                            ""propertyNames"": [
                                ""quote$distributor_id""
                            ]
                        }
                    ],
                    ""severity"": ""error"",
                    ""code"": ""incomplete_attr""
                }
            ]
        }
    }
}";
    var severity = GetJsonPropertyValue(json, "severity");
    Console.WriteLine(severity);
    Console.ReadKey();
}
© www.soinside.com 2019 - 2024. All rights reserved.