Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#使用HttpClient从JSON响应中获取特定对象_C#_Json_Parsing_Httpclient - Fatal编程技术网

C#使用HttpClient从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

我正在尝试从GoogleMapsAPI解析json以进行地理编码

JSON是:

{
"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
        };
}