"_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;
}
您可以采用递归方法,如果找到一个值,则返回。
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'));
只需使用递归函数来遍历所有级别。
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);
假设您要使用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();
}