【问题标题】:How Deserialize JSON Api result如何反序列化 JSON Api 结果
【发布时间】:2019-05-30 10:22:50
【问题描述】:

我通过 Api 获取结果。我不知道需要配置哪个类才能使这一点消失。

"{
  \"errors\":{\"Email\": [\"This field should be filled in\"],
            \"Password\": [\"This field should be filled in\"]},
  \"title\":\"One or more validation errors occurred.\",
  \"status\":400,
  \"traceId\":\"8000006c-0002-fe00-b63f-84710c7967bb\"
}"

我写这个类来反序列化

public class Content
{
    public List<Error> Errors { get; set; }
    public string Tutle { get; set; }
    public int Status { get; set; }
    public string TraceId { get; set; }
}

public class Error
{
    public string Email { get; set; }
    public string Password { get; set; }
}

Newtonsoft.Json.JsonSerializationException: '无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.List`1[AppStore.WPF.Services.Helpers.Error ]' 因为该类型需要一个 JSON 数组(例如 [1,2,3])才能正确反序列化。

后来越来越晚了,其实不代表怎么写正确的类

【问题讨论】:

  • 你有没有尝试过?我们不会为您编写代码,但是当您遇到问题时,我们很乐意提供帮助。
  • 我不明白如何编写需要反序列化的类。它需要为 main、Email 和 Password 创建 3 个类。我知道如何使用牛顿。
  • 那里有成百上千的教程,通过阅读它们,您将学到比在这里提问更多的东西。
  • 感谢您更新您的问题,正因为如此,您现在有了答案!

标签: c# json


【解决方案1】:

您正在尝试使用:

public List<Error> Errors { get; set; }

public class Error
{
    public string Email { get; set; }
    public string Password { get; set; }
}

反序列化:

\"errors\":{\"Email\": [\"This field should be filled in\"],
        \"Password\": [\"This field should be filled in\"]},

仔细查看 JSON(和错误消息); Email 和 Password 需要一个字符串数组。来自 API 的假设响应可能如下所示:

\"errors\":{\"Email\": [\"This field should be filled in\"],
        \"Password\": [\"Password must be at least 8 characters\",
                      \"Password must contain at least one digit\"]
},

纠正这个问题的第一次尝试可能是:

public class Error
{
    public string[] Email { get; set; }
    public string[] Password { get; set; }
}

但是,从上下文看来,Email 和 Password 指的是正在验证的输入项,并且结果可能包含其他项,例如PhoneNumber:

\"errors\":{\"Email\": [\"This field should be filled in\"],
        \"Password\": [\"This field should be filled in\"],
        \"PhoneNumber\": [\"This field should be filled in\"]
},

这样你真的想将它反序列化为字典,即替换:

public List<Error> Errors { get; set; }

作者:

public Dictionary<string, string[]> Errors {get; set; }

【讨论】:

    【解决方案2】:

    您可以使用 JSON.NET。 这里有很多信息: https://www.newtonsoft.com/json/help/html/SerializingJSON.htm

    您可以使用动态 JObject,或反序列化为具体类

    【讨论】:

    • 这应该是个评论。
    • @DavidG 我认为这回答了这个问题。如果问题更具体,答案也会更具体。我不会解释所有可能的选项,这些选项在链接中都有明确的解释。这将是重写文档,这是没有意义的。不过,我尊重你的意见。
    • 所以你的意思是这个问题不够好,不应该回答? :)
    • @DavidG。当然,这个问题可以更好,但我不认为对一个一般性问题给出一个一般性的答案是邪恶的。或许Q作者不知道从何说起,这个指针可以给他一些思路。我可能是错的,但有时您必须尝试了解提出问题的人的意图。如果您认为 Q 不好,请投反对票。或者要求关闭它。不要把它归咎于答案;)
    • 那么如果问题是一般性问题,应该这样问,但是已经有数百个这样的问题了。找到一个规范的副本会更节省您的时间。
    猜你喜欢
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    相关资源
    最近更新 更多