【问题标题】:Serialization Exception: unexpected character '<'序列化异常:意外字符“<”
【发布时间】:2017-09-27 15:41:46
【问题描述】:

我有一个假设获取天气数据的简单方法,当我调用它时会发生此错误:

System.Runtime.Serialization.SerializationException 未被用户代码处理 H结果=-2146233076 消息=反序列化 UWpWeather.RootObject 类型的对象时出错。遇到了意外的字符“

public async static Task <RootObject> GetWeather(double lat, double lng) {
    var http = new HttpClient();
    var response = await http.GetAsync("http://api.openweathermap.org/data/2.5/forecast/daily?q=leeds&type=accurate&mode=xml&units=metric&cnt=3&appid= MY AIP-KEY");
    string result = await response.Content.ReadAsStringAsync();
    var serializer = new DataContractJsonSerializer(typeof (RootObject));
    var ms = new MemoryStream(Encoding.UTF8.GetBytes(result));
    var data = (RootObject) serializer.ReadObject(ms);
    return data;
}

【问题讨论】:

  • 您正在使用 JSON 序列化程序并从 API 请求 XML。
  • 结果好像是XML格式的。尝试为 JSON 格式添加内容类型标头,或使用 XML 序列化器
  • 好的,如何使用 XML 序列化程序?抱歉,我是新手,谢谢!

标签: c# api weather


【解决方案1】:

我找到了答案,我的第一个错误是在调用我的数据时使用 Xml 而不是 Json。其次,当我使用这个网站 (json2csharp) 将 Json 转换为代表我的 Json 的一系列类时,它创建它很好,除了一个创建为列表 public List<List> list { get; set; } 我只是删除了那个,我的代码现在工作得很好。感谢大家的支持。

【讨论】:

    【解决方案2】:

    API支持您在请求中传递的任何 HTTP 内容或 Accept 标头,而是根据查询字符串参数设置响应的内容类型。

    您的初始网址:

    http://api.openweathermap.org/data/2.5/forecast/daily?q=leeds&type=accurate&mode=xml&units=metric&cnt=3&appid= 我的 AIP-KEY"

    应该是什么:

    http://api.openweathermap.org/data/2.5/forecast/daily?q=leeds&type=accurate&mode=json&units=metric&cnt=3&appid= 我的 AIP-KEY"

    这应该允许您正确地将其反序列化为您的RootObject

    警告:我没有你的根对象实现,所以我只能在收到 JSON 格式的响应之前进行验证。

    【讨论】:

    • Yannick Meeus,谢谢。正如你所说,我改变了我的代码,现在我得到了另一个错误:期待状态'元素'..遇到名称为“,命名空间”的'文本'。顺便说一句,当将该地址放入 Firefox 时,我会按预期获得天气数据。
    • 这很可能与您的 RootObject 设置不正确有关。你能发布你的 RootObject 实现吗?一旦我复制了一个示例 JSON 响应,我倾向于生成这些的方式是“选择性粘贴 - 将 JSON 粘贴为类”。这几乎可以保证我能够正确反序列化。我刚刚使用生成的 RootObject 运行了您的代码,并且一切正常,这就是为什么我猜测它是您的 RootObject。在接下来的 16 个小时里,我将飞行,但如果你无法解决问题,那么我可以再看看。
    • 我有兴趣看到您的代码,因为它可能在其他情况下有所帮助。我这样调用我的方法: RootObject myWeather = await OpenWeather.GetWather(12.2, 32.0);
    猜你喜欢
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 2019-08-22
    • 2020-11-20
    相关资源
    最近更新 更多