C# 解析HttpResponse中的单个值

C# 解析HttpResponse中的单个值,c#,json,http,C#,Json,Http,在调用GoogleGeolocationAPI时,结果(json)如下返回 示例(抱歉,我无法正确格式化Json) 我需要从返回的数据中检索各种单个项,例如duration:text值。 有没有办法过滤掉API调用中多余的内容,或者如何从Json解析这些内容 我尝试反序列化一个对象,然后对其进行迭代并获取legs数组,但是A.这不起作用,因为对象位于大项目上,而不是集合上;B.这似乎是浪费 public int TravelTimeInMinutes(string origin, string

在调用GoogleGeolocationAPI时,结果(json)如下返回

示例(抱歉,我无法正确格式化Json)

我需要从返回的数据中检索各种单个项,例如duration:text值。 有没有办法过滤掉API调用中多余的内容,或者如何从Json解析这些内容

我尝试反序列化一个对象,然后对其进行迭代并获取legs数组,但是A.这不起作用,因为对象位于大项目上,而不是集合上;B.这似乎是浪费

 public int TravelTimeInMinutes(string origin, string destination, string apiKey)
    {
        var timeToTravel = 0;

        var url = DirectionsUrlBase + ConvertOriginFormat(origin) + ConvertDestinationFormat(destination) + "&key="+ apiKey;
        var client = new HttpClient();

        // Add the Accept type header for JSON format.
        client.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/json"));

        // get the response
        // make method async once working
         var response = client.GetAsync(url).Result;   
        if (response.IsSuccessStatusCode)
        {
            // Parse the response body.
            var result = JsonConvert.SerializeObject(response.Content.ReadAsStringAsync().Result());
            dynamic array = JsonConvert.DeserializeObject(result);
            foreach (var item in array)
            {

            }
          //… rest removed for brevity
如何向下搜索以检索单个值?我认为我的错误在于如何反序列化响应。我还有一个带有文本和值属性的Duration类。如果可能的话,我想反序列化到那个类

跟进

我在序列化调用之后添加了
.Result
response.Content.ReadAsStringAsync().Result()

现在返回正确的json

现在我如何从这个类中解析单个值,或者反序列化到Duration类中。 根据查尔斯的建议

我有一个根对象

公共类MapsDirectionObject { 公共地理编码航路点[]地理编码航路点{get;set;} 公共路由[]路由{get;set;} }

因为返回的json只有两个主要的子类,routes和Waypoint,所以我也有这些类。反序列化错误包含以下错误

Newtonsoft.Json.JsonSerializationException:“转换值“{”地理编码的_航路点时出错:”[ {

如果删除序列化的.Result调用,则可以映射到该对象,但值为null


首先,请在您的答案上发布一个完整有效的JSON对象

您使用Visual Studio进行编码,对吗?您可以使用特殊粘贴获得帮助:

1) 将整个JSON复制到剪贴板

2) 在Visual Studio上打开类文件

3) 进入“编辑>粘贴特殊>粘贴为JSON类”菜单

4) 你会得到这样的结果:

public class Rootobject
{
    public Geocoded_Waypoints[] geocoded_waypoints { get; set; }
}

public class Geocoded_Waypoints
{
    public string geocoder_status { get; set; }
    public string place_id { get; set; }
    public string[] types { get; set; }
}
现在可以反序列化到类型化对象:

var myObject = JsonConvert.DeserializeObject<Rootobject>(result);

foreact(var geocoded_waypoints in myObject.geocoded_waypoints)
{
    // do something with geocoded_waypoints
}

// your duration object:
var duration = myObject.routes[0].legs[0].duration;
var myObject=JsonConvert.DeserializeObject(结果);
foreact(myObject.geocoded_航路点中的var地理编码_航路点)
{
//对地理编码的航路点做些什么
}
//您的持续时间对象:
var duration=myObject.routes[0]。legs[0]。duration;

如果需要,您可以将Rootobject重命名为您想要的任何名称,如Geolocation

首先,我希望我们进行强类型反序列化,因此让我们创建与JSON中所需数据对应的类:

public class ResultData
{
    [JsonProperty("routes")]
    public List<Route> Routes { get; set; }
}

public class Route
{
    [JsonProperty("legs")]
    public List<Leg> Legs { get; set; }
}

public class Leg
{
    [JsonProperty("duration")]
    public Duration Duration { get; set; }
}

public class Duration
{
    [JsonProperty("text")]
    public string Text { get; set; }
    [JsonProperty("value")]
    public int Value { get; set; }
}
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = client.GetAsync("https://maps.googleapis.com/maps/api/directions/json?origin=7+7+Lakeside+Dr+Rye+NY&destination=Winged+Winged+Foot+Golf+Club").Result;
if (response.IsSuccessStatusCode)
{
    var desed = JsonConvert.DeserializeObject<ResultData>(response.Content.ReadAsStringAsync().Result);
    var durations = desed.Routes.SelectMany(r => r.Legs.Select(l => l.Duration)).ToList();
    durations.ForEach(d => Console.WriteLine($"T: {d.Text}, V: {d.Value}"));
}
公共类结果数据
{
[JsonProperty(“路线”)]
公共列表路由{get;set;}
}
公务舱路线
{
[JsonProperty(“腿部”)]
公共列表{get;set;}
}
公务舱航段
{
[JsonProperty(“期限”)]
公共持续时间{get;set;}
}
公共课时长
{
[JsonProperty(“文本”)]
公共字符串文本{get;set;}
[JsonProperty(“价值”)]
公共int值{get;set;}
}
然后我们反序列化JSON:

public class ResultData
{
    [JsonProperty("routes")]
    public List<Route> Routes { get; set; }
}

public class Route
{
    [JsonProperty("legs")]
    public List<Leg> Legs { get; set; }
}

public class Leg
{
    [JsonProperty("duration")]
    public Duration Duration { get; set; }
}

public class Duration
{
    [JsonProperty("text")]
    public string Text { get; set; }
    [JsonProperty("value")]
    public int Value { get; set; }
}
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = client.GetAsync("https://maps.googleapis.com/maps/api/directions/json?origin=7+7+Lakeside+Dr+Rye+NY&destination=Winged+Winged+Foot+Golf+Club").Result;
if (response.IsSuccessStatusCode)
{
    var desed = JsonConvert.DeserializeObject<ResultData>(response.Content.ReadAsStringAsync().Result);
    var durations = desed.Routes.SelectMany(r => r.Legs.Select(l => l.Duration)).ToList();
    durations.ForEach(d => Console.WriteLine($"T: {d.Text}, V: {d.Value}"));
}
var-client=new-HttpClient();
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
var response=client.GetAsync(“https://maps.googleapis.com/maps/api/directions/json?origin=7+7+湖边+Dr+黑麦+纽约&目的地=飞翼+飞翼+足部+高尔夫+俱乐部”)。结果;
if(响应。IsSuccessStatusCode)
{
var desed=JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().Result);
var durations=desed.Routes.SelectMany(r=>r.Legs.Select(l=>l.Duration)).ToList();
ForEach(d=>Console.WriteLine($“T:{d.Text},V:{d.Value}”);
}
注:
跳过序列化步骤…
ReadAsStringAsync()
应该生成一个有效的JSON字符串

…我没有一个完整的返回对象,因为返回数据远远超出了我的需要。我很想知道它是否可过滤,例如在腿上请求的方式:duration data。我有一个duration类。请参阅我对OPDo的后续补充。使用完整的JSON文件执行步骤,您将拥有所有的tre对于对象,您将需要它进行反序列化,在仅获取您需要的内容并可能放入另一个模型之后,我的编辑菜单上没有“粘贴”特殊选项VS您使用的版本是什么?请参见此以修复:VS 2017以上两种方法均不起作用(两种答案)。我得到的错误是它无法转换data@dinotom尝试使用'JsonProperty'属性你能提供一个有效的json来测试吗?@dinotom我注意到有一个名为
Result
的根对象我根据需要更改了答案我发布了完整的json