在多级JSON数组中搜索一个关键字

本文关键字:一个 关键字 搜索 多级 JSON 数组 | 更新日期: 2023-09-27 18:20:58

我从几个不同的web服务接收JSON输出。我需要从每个服务中获得一些令牌数据,但每次都在不同的数组中。例如:

服务1:

{
    "service_name": "service1",
    "service1_data": {
        "token_data": "WSD123456789"
    }
}

服务2:

{
     "service_name": "service2",
     "service2_data": {
         "token_data": "QSD76662345"
     }
}

因此,我正在寻找一种方法来搜索"token_data"的值,无论它在数组中的哪个位置。目前,我必须手动获取它,如下所示:

json1["service1_data"]["token_data"]

如果有一个简单的方法可以做到这一点,我们将不胜感激。谢谢

在多级JSON数组中搜索一个关键字

您可以将JSON转换为XML,然后使用类似"//token_data"的xpath来查找令牌,假设不能选择简单的字符串搜索或regex。

byte[] bytes = Encoding.ASCII.GetBytes(json);
using (var stream = new MemoryStream(bytes))
{
    var quotas = new XmlDictionaryReaderQuotas();
    var jsonReader = JsonReaderWriterFactory.CreateJsonReader(stream, quotas);
    var xml = XDocument.Load(jsonReader);
}

Xpath信息可以在这里找到

正如注释中所建议的,您可以使用JSONPath。

在您的场景中,$.service1_data.token_data.*应该为您提供所需的所有值。

只有当数组中token_data的深度始终相同时,这才有效。

NuGet-Install-Package Newtonsoft.Json上提供的Newtonsoft.Json包允许您使用LINQ表达式遍历Json对象。

var jsonText = @"{
    ""service_name"": ""service1"",
    ""service1_data"": {
        ""token_data"": ""WSD123456789""
    }
}";
var jsonObject = JsonConvert.DeserializeObject<JToken>(jsonText);
System.Diagnostics.Debug.Assert(jsonObject["service1_data"].Value<string>("token_data") == "WSD123456789");

请参阅JToken参考,了解如何从Json检索值。

相关文章: