【发布时间】:2015-02-16 14:34:44
【问题描述】:
我有一个使用 DataContract 和 DataMember 属性注释的类。一些成员被标记为DataMember(IsRequired = true)。当我通过 Json.NET 的线路序列化实例,并且所需的对象成员具有空值时,输出中缺少它们的序列化值(这显然等同于 JSON 中的空值)。我没关系。
我创建了一种“回声”服务,它返回作为响应发送给它的数据。因此,此服务接收缺少成员(或空成员,具体取决于您如何看待它)的 JSON,然后将其直接发送回我的 Json.NET 客户端。通过 Fiddler(代理嗅探器)查看时,线路上的 JSON 在两个方向上看起来都相同。到目前为止一切顺利。
当原始 Json.NET 发送方收到 JSON 响应以对其进行反序列化时,序列化程序会抛出关于在 JSON 有效负载中找不到所需成员的异常:
Required property 'IAmRequired' not found in JSON. Path ''.
这很不幸,因为序列化程序因此无法反序列化它之前序列化的数据。
没有更改 DataContract 类以使成员不需要(出于多种原因我不想这样做),有没有办法让 Json.NET 将缺少的成员反序列化为默认值,例如 null?
这是我的反序列化代码:
HasRequired h = null;
JObject json = response as JObject; // hand waving here
try
{
JsonSerializer ser = new JsonSerializer();
ser.MissingMemberHandling = MissingMemberHandling.Ignore; // doesn't seem to help
ser.DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate; // doesn't seem to help
ser.NullValueHandling = NullValueHandling.Include; // doesn't seem to help
h = json.ToObject<HasRequired>(ser);
}
catch (Exception ex)
{
// bummer, missing required members still
}
【问题讨论】:
-
等等,你有标记为必需的成员,但他们真的不是必需的?
-
它们是必需的......但只是为了满足 DataContractSerializer 的一些迟钝规则,以便能够处理 WCF 的序列化(对于 SOAP 绑定),并且不让类型看起来对客户端来说很糟糕。我知道你在说什么;如果不是 DC 串行器,它们将是可选的。对于我试图避免提及的 SOAP 序列化端,对象被序列化为 XML 空实例(它们被显式发送为空)。
-
我明白了。我添加了一个对您有帮助的答案。
标签: json.net