【问题标题】:Deserialize with Json.Net fails on some fields使用 Json.Net 反序列化在某些字段上失败
【发布时间】:2015-05-13 12:07:54
【问题描述】:

我尝试使用 Json.Net 将 Json 反序列化为 c# 对象。

c#类:

public class Evaluation
{
    [DataMember(Name = "id")]
    public int Id { get; set; }

    [DataMember(Name = "avg")]
    public string Average { get; set; }

    [DataMember(Name = "median")]
    public string Median { get; set; }

    [DataMember(Name = "teacherID")]
    public int TeacherId { get; set; }

    [DataMember(Name = "evalType")]
    public int EvaluationType { get; set; }
}

单元测试:

[Test]
[TestCase()]
public void TestParsing()
{
    string json = "{" +
                "\"id\": 439476," +
                "\"avg\": \"69\"," +
                "\"median\": \"75\"," +
                "\"teacherID\": 1," +
                "\"evalType\": 1" +
                "}";

    Evaluation evaluation = JsonConvert.DeserializeObject<Evaluation>(json);

    Assert.IsTrue(evaluation.Average.Equals("69"));
    Assert.IsTrue(evaluation.EvaluationType == 1);
}

这会失败,因为evaluation.Average 为null,且evaluation.EvaluationType 为0。其他字段解析正确。

为什么会失败?

【问题讨论】:

  • 这是一个非常明确且清晰的问题。对此表示赞赏!

标签: c# json json.net deserialization


【解决方案1】:

在类声明中设置DataContract 属性应该可以解决问题:

[DataContract]
public class Evaluation
{
    [DataMember(Name = "id")]
    public int Id { get; set; }

    [DataMember(Name = "avg")]
    public string Average { get; set; }

    [DataMember(Name = "median")]
    public string Median { get; set; }

    [DataMember(Name = "teacherID")]
    public int TeacherId { get; set; }

    [DataMember(Name = "evalType")]
    public int EvaluationType { get; set; }
}

【讨论】:

  • 我也是这么想的,但是文档建议您应该能够使用 DataMember:newtonsoft.com/json/help/html/SerializationAttributes.htm
  • @JonSkeet 我已经在本地复制了这个例子,它似乎完全放弃了DataMember
  • @JonSkeet 在类级别缺少DataContract 属性。
  • 在您的第二个示例中,您仍在使用JsonProperty - 我怀疑您打算使用DataMember(我已经验证确实在您使用得到了DataContract)
  • @JonSkeet 是的,我重构了整个答案。固定。
猜你喜欢
  • 1970-01-01
  • 2015-05-21
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多