【问题标题】:JSON Deserialization in C# errorC# 错误中的 JSON 反序列化
【发布时间】:2016-06-09 15:36:23
【问题描述】:

我正在尝试在 C# 中反序列化一些 JSON,但是当我运行我的程序时,我收到了以下错误消息:

我查看了所有代码,但在任何不应该有的地方都找不到“http://forecast.weather.gov/MapClick.php?lat=47.1211&lon=-88.5694&FcstType=json, 并且没有“

var http = new HttpClient();
var url = "http://forecast.weather.gov/MapClick.php?lat=47.1211&lon=-88.5694&FcstType=json";
var response = await http.GetAsync(url);
var result = await response.Content.ReadAsStringAsync();
var serializer = new DataContractJsonSerializer(typeof(RootObject2));
var ms = new MemoryStream(Encoding.UTF8.GetBytes(result));
var data = (RootObject2)serializer.ReadObject(ms);
return data;

【问题讨论】:

  • 与其访问您从中获取它的网址,不如在调试器中查看您实际收到的内容?当您从 C# 获取与在浏览器中访问它时,服务器上的某些东西可能会为您提供不同的结果。理想情况下,提供minimal reproducible example
  • 我们能看到您将 json 读入字符串的部分和反序列化调用的行吗?
  • 我想说你有合理的机会从forecast.weather.gov/… 获得xml,而不是从forecast.weather.gov/… 获得json,但乔恩(当然!)绝对正确 - 更好地调试你是什么实际上是在尝试序列化而不是推测
  • @JonSkeet 我如何在调试器中查看我实际得到的结果?抱歉,我对此很陌生。
  • 好吧,鉴于您没有显示任何代码,很难说确切,但一般来说,您会在收到数据,但在您尝试将其解析为 JSON 之前。然后查看 locals/watch 窗口中的变量。

标签: c# json deserialization


【解决方案1】:

您的调用失败,因为您没有设置 API 期望的标头。添加用户代理并在尝试读取响应之前检查是否成功。

        var http = new HttpClient();
        var url = "http://forecast.weather.gov/MapClick.php?lat=47.1211&lon=-88.5694&FcstType=json";
       //Supply the same header as chrome
        http.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36");
        var response = await http.GetAsync(url);
        if (response.IsSuccessStatusCode)
        {
            var result = await response.Content.ReadAsStringAsync();
            var ms = new MemoryStream(Encoding.UTF8.GetBytes(result));
            var serializer = new DataContractJsonSerializer(typeof(RootObject2));
            var data = (RootObject2)serializer.ReadObject(ms);
        }

【讨论】:

    【解决方案2】:

    检查那个答案,它说连接有问题,他没有收到来自 API 的完整响应

    Unexpected character encountered while parsing value:

    【讨论】:

    • 可能,但我认为连接不太可能是坏的,因为我从其他三个 API(来自不同站点)接收数据正常。
    • 我在调用前添加了这两行,它可以看到 IsSuccessStatusCode true http.DefaultRequestHeaders.Accept.Clear(); http.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多