C# 无法读取来自 API 调用的 json 响应
C# Not able to read json Response from API Call
我调用天气 API - returns 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.JsonReaderException' 类型的未处理异常发生在 Newtonsoft.Json.dll
中
附加信息:从 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-
repose 在浏览器中如下-
[{"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"的值。
有人可以帮我吗?
谢谢!
当您应该使用 JArray class 时,您正在使用 JObject class,因为您尝试解析的 JSON 是一个数组 - 而不是一个对象:
最好为此创建一个模型。然后你可以简单地告诉 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; }
}
然后反序列化returnJSON如下:
var data1 = JsonConvert.DeserializeObject<WeatherData>(responseData1);
或者对于数组:
var data1 = JsonConvert.DeserializeObject<List<WeatherData>>(responseData1);
我调用天气 API - returns 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.JsonReaderException' 类型的未处理异常发生在 Newtonsoft.Json.dll
中附加信息:从 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- repose 在浏览器中如下-
[{"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"的值。 有人可以帮我吗? 谢谢!
当您应该使用 JArray class 时,您正在使用 JObject class,因为您尝试解析的 JSON 是一个数组 - 而不是一个对象:
最好为此创建一个模型。然后你可以简单地告诉 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; }
}
然后反序列化returnJSON如下:
var data1 = JsonConvert.DeserializeObject<WeatherData>(responseData1);
或者对于数组:
var data1 = JsonConvert.DeserializeObject<List<WeatherData>>(responseData1);