使用C#进行条件JSON反序列化

时间:2014-03-01 18:02:45

标签: c# json deserialization

我正在编写C#测试自动化来验证返回JSON字符串的Web服务。我创建了一个映射到返回内容的DataContract。假设这是返回的内容:

{"DataModule" : {"required":"false", "location":"toolbar"}}

我的测试自动化工作正常,但后来我开始收到此错误:

  

“无法对数据协定类型'DataModule'进行反序列化,因为   找不到所需的数据成员,位置'未找到。“

我检查了JSON,数据模块现在是

{"DataModule" : {"width":"400", "height":"320"}}

我发现开发实现是如果遇到第一种类型的数据模块,客户端会解析它并在工具栏上创建一个按钮。如果返回第二种类型的数据模块,则按钮会出现在工具栏上,并且面板会出现在另一个带有这些测量值的位置。

有没有办法在数据协定中创建可选成员或实现条件反序列化来解释可能有多个实现的JSON对象?

2 个答案:

答案 0 :(得分:0)

如果您使用所有可能的属性声明模型,则只会填充在JSON字符串中找到的属性:

public class DataModule
{
    public bool Required { get; set; }
    public string Location { get; set; }
    public string Width { get; set; }
    public string Height { get; set; }
}

答案 1 :(得分:0)

@戴夫-S

我已经尝试过添加所有属性,但是因为我知道我在正确的轨道上,所以你的建议将我锁定在别的东西上。所有属性都用

装饰
[System.Runtime.Serialization.DataMemberAttribute(IsRequired = false)]

但是班级本身只用[Serializable]装饰。当我将[Serializable]更改为

[System.Runtime.Serialization.DataContractAttribute()]

它开始工作了。