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

时间:2014-09-08 10:27:06

标签: c# json

我从几个不同的Web服务接收JSON输出。我需要从每个服务获取一些令牌数据,但每次都在不同的数组中。 E.g:

服务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"]

如果这是一个简单的方法,我们将非常感激。谢谢!

3 个答案:

答案 0 :(得分:0)

您可以将JSON转换为XML,然后使用类似'// token_data'的xpath来查找令牌,假设只是一个简单的字符串搜索或正则表达式。

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信息here

答案 1 :(得分:0)

根据评论中的建议,您可以使用JSONPath。

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

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

答案 2 :(得分:0)

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

请参阅the JToken reference以了解如何从Json中检索值。