C#使用HttpClient从JSON响应中获取特定对象
我正在尝试从GoogleMapsAPI解析json以进行地理编码 JSON是:C#使用HttpClient从JSON响应中获取特定对象,c#,json,parsing,httpclient,C#,Json,Parsing,Httpclient,我正在尝试从GoogleMapsAPI解析json以进行地理编码 JSON是: { "results" : [ { "address_components" : [ { "long_name" : "1600", "short_name" : "1600", "types" : [ "street_number" ] }, { "long_name
{
"results" : [
{
"address_components" : [
{
"long_name" : "1600",
"short_name" : "1600",
"types" : [ "street_number" ]
},
{
"long_name" : "Amphitheatre Parkway",
"short_name" : "Amphitheatre Pkwy",
"types" : [ "route" ]
},
{
"long_name" : "Mountain View",
"short_name" : "Mountain View",
"types" : [ "locality", "political" ]
},
{
"long_name" : "Santa Clara County",
"short_name" : "Santa Clara County",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"long_name" : "California",
"short_name" : "CA",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "United States",
"short_name" : "US",
"types" : [ "country", "political" ]
},
{
"long_name" : "94043",
"short_name" : "94043",
"types" : [ "postal_code" ]
}
],
"formatted_address" : "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
"geometry" : {
"location" : {
"lat" : 37.4224277,
"lng" : -122.0843288
},
"location_type" : "ROOFTOP",
"viewport" : {
"northeast" : {
"lat" : 37.4237766802915,
"lng" : -122.0829798197085
},
"southwest" : {
"lat" : 37.4210787197085,
"lng" : -122.0856777802915
}
}
},
"place_id" : "ChIJ2eUgeAK6j4ARbn5u_wAGqWA",
"types" : [ "street_address" ]
}
],
"status" : "OK"
}
我只对带有纬度和经度的位置
对象感兴趣,我想知道如何在c#中导航json对象树,以从HttpContent中检索它们,作为HttpClient上GetAsync的响应。
下面的代码片段说明了我的请求是如何完成的
public async Task<Coordinates> GeoCode(string address)
{
HttpClient client= new HttpClient();
var baseUrl = "http://maps.google.com/maps/api/geocode/json?address=";
var addressEncoded = WebUtility.UrlEncode(address);
var response= await client.GetAsync(baseUrl + addressEncoded);
if(response.IsSuccessStatusCode)
{
//read location ...
}
}
公共异步任务地理编码(字符串地址)
{
HttpClient=新的HttpClient();
var baseUrl=”http://maps.google.com/maps/api/geocode/json?address=";
var addressEncoded=WebUtility.UrlEncode(地址);
var response=await client.GetAsync(baseUrl+addressEncoded);
if(响应。IsSuccessStatusCode)
{
//读取位置。。。
}
}
如何读取location对象?一个选项是将JSON反序列化为类型化类和其他使用动态类型的类 JSON字符串表示具有三个属性的对象,这些属性被解析为JObject类并转换为dynamic。一旦转换为dynamic,我就可以继续使用熟悉的对象语法访问对象
我通常是这样做的。(我将json对象保存到D:/json.txt中)
var json=File.ReadAllText(“D:/json.txt”);
var results=JObject.Parse(json).SelectToken(“results”)作为JArray;
foreach(结果中的var结果)
{
var geometryEntry=result.SelectToken(“geometry.location”);
var经度=几何中心值(“lat”);
var纬度=几何中心值(“lng”);
Console.WriteLine(“{0},{1}”,经度,纬度);
}
输出:
作为一个选项,要检索坐标,您可以使用软件包提供的强类型对象:
公共异步任务地理编码(字符串地址)
{
GoogleGeocoder geocoder=新的GoogleGeocoder();
IEnumerable addresses=wait geocoder.GeocodeAsync(地址);
GoogleAddress first=地址?.FirstOrDefault();
返回第一个==null
无效的
:新坐标
{
纬度=第一。坐标。纬度,
经度=第一。坐标。经度
};
}
谢谢,动态解决方案看起来很有趣,知道如何从response.content解析为动态吗?只需使用response.content.ReadAsStringAsync()将json转换为System.String并将其传递给parse方法即可。
public void JValueParsingTest()
{
var jsonString = @"{""Name"":""Rick"",""Company"":""West Wind"",
""Entered"":""2012-03-16T00:03:33.245-10:00""}";
dynamic json = JValue.Parse(jsonString);
// values require casting
string name = json.Name;
string company = json.Company;
DateTime entered = json.Entered;
Assert.AreEqual(name, "Rick");
Assert.AreEqual(company, "West Wind");
}
var json = File.ReadAllText("D:/json.txt");
var results = JObject.Parse(json).SelectToken("results") as JArray;
foreach (var result in results)
{
var geometryEntry = result.SelectToken("geometry.location");
var longitude = geometryEntry.Value<double>("lat");
var latitude = geometryEntry.Value<double>("lng");
Console.WriteLine("{0}, {1}", longitude, latitude);
}
public async Task<Coordinates> GeoCode(string address)
{
GoogleGeocoder geocoder = new GoogleGeocoder();
IEnumerable<GoogleAddress> addresses = await geocoder.GeocodeAsync(address);
GoogleAddress first = addresses?.FirstOrDefault();
return first == null
? null
: new Coordinates
{
Latitude = first.Coordinates.Latitude,
Longitude = first.Coordinates.Longitude
};
}