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

Posted

技术标签:

【中文标题】C# 无法从 API 调用读取 json 响应【英文标题】:C# Not able to read json Response from API Call 【发布时间】:2016-10-18 09:31:29 【问题描述】:

我调用 Wea​​ther 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”的值。 有人可以在这里帮助我吗? 谢谢!

【问题讨论】:

嗨@DanielGimenez,我刚刚修改了sn-p。你可以请现在检查。 【参考方案1】:

您正在使用 JObject 类,而您应该使用 JArray 类,因为您尝试解析的 JSON 是一个数组,而不是一个对象:

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

【讨论】:

【参考方案2】:

最好为此创建一个模型。然后你可以简单地告诉 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);

【讨论】:

以上是关于C# 无法从 API 调用读取 json 响应的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的应用程序无法从我的 API 读取 JSON?

jQuery ajax 调用无法从 CakePHP 3.8 读取 json 编码数据(获取一个空数组)

DataFlow 无法读取存储在 Blob 存储中的 API 响应 json 文件

C# 无法读取和解释 Web API/JSON

如何在 C# Asp.Net 中从相当复杂的 Json 响应中创建 Dto

无法反序列化 JSON 响应