C#无法从API调用中读取json响应

时间:2016-06-16 18:06:57

标签: c# json json.net deserialization jsonserializer

我调用了一个Weather API - 它返回了Json响应。 我的C#代码 -

           Uri uri1 = new Uri(APIUrl);
           WebRequest webRequest1 = WebRequest.Create(uri1);
           WebResponse response1 = webRequest1.GetResponse();
           StreamReader streamReader1 = new StreamReader(response1.GetResponseStream());
           String responseData1 = streamReader1.ReadToEnd().ToString();
           dynamic data1 = JObject.Parse(responseData1 )

我在调用Parse时遇到异常,如下所示 - Newtonsoft.Json.dll中出现未处理的“Newtonsoft.Json.JsonReaderException”类型异常

其他信息:从JsonReader读取JObject时出错。当前的JsonReader项不是对象:StartArray。路径'',第1行,第1位。

我的分析 - responseData1将json字符串设为 -

responseData1="[{\"locationName\":\"Bangalore\",\"subLocationName\":null,\"gid\":\"43295\",\"subStateID\":null,\"subStateName\":null,\"stateID\":\"II\",\"stateName\":\"Indien\",\"latitude\":12.9667,\"longitude\":77.5833,\"altitude\":900,\"zip\":null}\n, {\"match\":\"yes\"}]"

如果我在http://jsonlint.com/中检查这个json - 它说有效的json。

如果我直接在浏览器中点击我的APIUrl- 浏览器中的休止符如下 -

[{"locationName":"Bangalore","subLocationName":null,"gid":"43295","subStateID":null,"subStateName":null,"stateID":"II","stateName":"Indien","latitude":12.9667,"longitude":77.5833,"altitude":900,"zip":null}, {"match":"yes"}]

我的目标是从上面的json中读取属性“gid”的值。 有人可以帮我吗? 谢谢!

2 个答案:

答案 0 :(得分:4)

当你应该使用JArray类时,你正在使用JObject类,因为你试图解析的JSON是一个数组 - 而不是一个对象:

http://www.newtonsoft.com/json/help/html/ParseJsonArray.htm

答案 1 :(得分:1)

最好为此创建一个模型。然后,您可以简单地告诉Newtonsoft反序列化JSON字符串,而不是使用动态类型。

首先,您需要创建一个这样的模型:

public class WeatherData
{
    public string locationName { get; set; }
    public string subLocationName { get; set; }
    public string gid { get; set; }
    public int subStateID { get; set; }
    public string subStateName { get; set; }
    public string stateID { get; set; }
    public string stateName { get; set; }
    public double latitude { get; set; }
    public double longitude { get; set; }
    public int altitude { get; set; }
    public string zip { get; set; }
    public string match { get; set; }
}

然后按如下方式反序列化返回JSON:

var data1 = JsonConvert.DeserializeObject<WeatherData>(responseData1);

或者对于数组:

var data1 = JsonConvert.DeserializeObject<List<WeatherData>>(responseData1);