C# 从JSON字符串中的任意位置查找和检索键控值

C# 从JSON字符串中的任意位置查找和检索键控值,c#,linq,json.net,C#,Linq,Json.net,我正在检索JSON,它可能在内容项中有所不同,并希望找到与特定键相关的值,例如,在本例中为“地理纬度”和“地理经度”。为了清楚起见,我在这个JSON示例中只包含这两项。(通常要长得多,并且没有特定的顺序) 这是我能想到的解析JSON的最好方法。有更好的办法吗 var metadataObj = JArray.Parse(postMetadataJsonStr); var latContainer = metadataObj.Descendants() .OfType<JObjec

我正在检索JSON,它可能在内容项中有所不同,并希望找到与特定键相关的值,例如,在本例中为“地理纬度”和“地理经度”。为了清楚起见,我在这个JSON示例中只包含这两项。(通常要长得多,并且没有特定的顺序)

这是我能想到的解析JSON的最好方法。有更好的办法吗

var metadataObj = JArray.Parse(postMetadataJsonStr);

var latContainer = metadataObj.Descendants()
    .OfType<JObject>()
    .Where(x => x["key"] != null &&
                x["key"].Value<string>() == "geo_latitude").Select(y => y["value"]);

var latTokenJValue = latContainer.FirstOrDefault();
if (latTokenJValue == null) return;
var latitude = latTokenJValue.ToString();
var metadataObj=JArray.Parse(postMetadataJsonStr); var latContainer=metadataObj.subjects() 第()类 。其中(x=>x[“键”!=null&& x[“键”]。值()=“地理纬度”)。选择(y=>y[“值”); var latTokenJValue=latContainer.FirstOrDefault(); if(latTokenJValue==null)返回; var latitude=latTokenJValue.ToString();
我会将您的json转换为字典

var metadataObj = JArray.Parse(postMetadataJsonStr);
var dict = metadataObj.ToDictionary(x => (string)x["key"], x => (double)x["value"]);

Console.WriteLine(dict["geo_latitude"]);

你可以试试使用。它支持查询语法。此外,您可以使用on
JToken
并避免
null
检查:
.Where(x=>(string)x[“key”]==“geo_latitude”)
,这看起来有点简单。@dbc使用SelectTokens,我可以得到var latitude=metadataObj.SelectToken($[?(@.key==“geo_latitude”).value”).ToString();顺便说一句(我知道我的示例数据中没有包含这个),我必须将字典值视为字符串。其余大部分数据都是文本数据。这只是意味着在适当的时间额外转换为double。@Stonetip然后用
(string)
替换
(double)
var metadataObj = JArray.Parse(postMetadataJsonStr);
var dict = metadataObj.ToDictionary(x => (string)x["key"], x => (double)x["value"]);

Console.WriteLine(dict["geo_latitude"]);