.net 如何使用Linq从Google地理编码中获取城市信息

.net 如何使用Linq从Google地理编码中获取城市信息,.net,json,linq,.net,Json,Linq,我有一个来自谷歌地理编码API的JSON blob,其中包含一个城市的名称。我只是在寻找linq表达式来表达出来 JSON: 以下是我的标准: 给定“结果”中的“结果”,结果“类型”包含“位置” 对于结果,我希望“address\u components”中的项,其中“types”包含“locality” 更新: 这是可行的,但似乎可以更简洁: if (responseObject["results"].Children().Count() > 0) {

我有一个来自谷歌地理编码API的JSON blob,其中包含一个城市的名称。我只是在寻找linq表达式来表达出来

JSON:

以下是我的标准: 给定“结果”中的“结果”,结果“类型”包含“位置”
对于结果,我希望“address\u components”中的项,其中“types”包含“locality”

更新:

这是可行的,但似乎可以更简洁:

if (responseObject["results"].Children().Count() > 0)
        {
            var postalResult = responseObject["results"].Children().FirstOrDefault((result) =>
            {
                return result["types"].Children().Contains("locality");
            });

            if(postalResult !=null)
            {
                var addressComponent = postalResult["address_components"].FirstOrDefault((ac) =>
                {
                    return ac["types"].Children().Contains("locality");
                });

                if(addressComponent != null)
                {
                    cityFromGoogle = addressComponent["long_name"].Value<string>().ToLower();
                }
            }
        }
if(responseObject[“results”].Children().Count()>0)
{
var postalResult=responseObject[“结果”].Children().FirstOrDefault((结果)=>
{
返回结果[“类型”]。Children()包含(“位置”);
});
if(postalResult!=null)
{
var addressComponent=postalResult[“地址组件”]。FirstOrDefault((ac)=>
{
返回ac[“types”].Children().Contains(“locality”);
});
if(addressComponent!=null)
{
cityFromGoogle=addressComponent[“long_name”].Value().ToLower();
}
}
}

如果将json转换为具体的类,则可以轻松地处理它们

var resp = JsonConvert.DeserializeObject<Google.Response>(json);

var addresses = resp.results.Where(x => x.address_components.Any(a => a.types.Contains("locality")))
                    .ToList();
var resp=JsonConvert.DeserializeObject(json);
var address=resp.results.Where(x=>x.address\u components.Any(a=>a.types.Contains(“locality”))
.ToList();

公共类谷歌
{
公共类地址组件
{
公共字符串长_名称{get;set;}
公共字符串短_名称{get;set;}
公共列表类型{get;set;}
}
公共类位置
{
公共双lat{get;set;}
公共双精度{get;set;}
}
公共类界限
{
公共位置{get;set;}
公共位置{get;set;}
}
公共课几何
{
公共位置位置{get;set;}
公共字符串位置\u类型{get;set;}
公共边界视口{get;set;}
公共边界{get;set;}
}
公开课成绩
{
公共列表地址_组件{get;set;}
公共字符串格式的_地址{get;set;}
公共几何体{get;set;}
公共列表类型{get;set;}
}
公众课堂反应
{
公共列表结果{get;set;}
公共字符串状态{get;set;}
}
}

我本来要走这条路,但我真的只需要一条信息。如果NewtonSoft可以用linq为我处理它,我不想写一堆代码
var resp = JsonConvert.DeserializeObject<Google.Response>(json);

var addresses = resp.results.Where(x => x.address_components.Any(a => a.types.Contains("locality")))
                    .ToList();
public class Google
{
    public class AddressComponent
    {
        public string long_name { get; set; }
        public string short_name { get; set; }
        public List<string> types { get; set; }
    }

    public class Location
    {
        public double lat { get; set; }
        public double lng { get; set; }
    }

    public class Bounds
    {
        public Location northeast { get; set; }
        public Location southwest { get; set; }
    }

    public class Geometry
    {
        public Location location { get; set; }
        public string location_type { get; set; }
        public Bounds viewport { get; set; }
        public Bounds bounds { get; set; }
    }

    public class Result
    {
        public List<AddressComponent> address_components { get; set; }
        public string formatted_address { get; set; }
        public Geometry geometry { get; set; }
        public List<string> types { get; set; }
    }

    public class Response
    {
        public List<Result> results { get; set; }
        public string status { get; set; }
    }
}