2017-01-06 128 views
1

我有以下JSON(简化/缩小以示出仅相关部分)从web服务返回:如何使用JPATH在另一个JSON字符串中选择一个JSON值?

{ 
    "results": [{ 
     "paramName": "OutputPolyline", 
     "dataType": "String", 
     "value": "#{\"hasM\":true,\"paths\":[[[135.24,246.13,null],[135.24,246.13,null] ... [135.24,246.13,null]]]}" 
    }], 
    "messages": [] 
} 

我使用下面的代码来解析JSON和抢“值”的值的密钥:

JObject obj = JObject.Parse(json); 
JToken token = obj.SelectToken("$.results[?(@.paramName == 'OutputPolyline')]['value']"); 

Console.WriteLine(token.Path + " -> " + token); 

上面的代码返回预期整个value字符串,像这样"#{\"hasM\":true,\"paths\":[[[135.24,246.13,null],[135.24,246.13,null] ... [135.24,246.13,null]]]}"

大厦上面的代码,我怎么得到才值关键?在这个例子中,仅返回[[[135.24,246.13,null],[135.24,246.13,null] ... [135.24,246.13,null]]]

回答

1

无法通过单一的JsonPath查询提取根对象的路径值,因为value属性的值只是一个字符串字面量出现这种情况本身重新序列化JSON。在首先修剪掉#字符后,它需要提取并递归地解析为JSON,而Json.NET没有内置的query operator来做到这一点,就像当前版本9.0.1一样。

因此,你需要做的是这样的:

JToken token = obj.SelectToken("$.results[?(@.paramName == 'OutputPolyline')]['value']"); 

var paths = JToken.Parse(token.ToString().Trim('#')).SelectToken("paths"); 

fiddle

相关问题