Json.Net 反序列化在某些字段上失败

4

我会尝试使用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为空并且evaluation.EvaluationType为0。其他字段被正确解析了。
为什么会这样失败?

1
这是一个非常清晰明了的问题。对此我要向你致敬! - Yuval Itzchakov
1个回答

6

在类声明中设置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; }
}

3
我也是这么想的,但文件表明你应该能够使用DataMember:http://www.newtonsoft.com/json/help/html/SerializationAttributes.htm - Jon Skeet
@JonSkeet 我已经在本地复制了这个示例,似乎完全忽略了 DataMember - Yuval Itzchakov
@JonSkeet 在类级别上缺少了 DataContract 属性。 - Yuval Itzchakov
在你的第二个示例中,你仍然使用了 JsonProperty - 我猜你想使用 DataMember(我已经验证了当你有 DataContract 时它确实可以工作)。 - Jon Skeet
@JonSkeet 是的,我重构了整个答案。已修复。 - Yuval Itzchakov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接