不要在JSON响应中发送null

时间:2012-04-09 16:06:59

标签: json wcf web-services rest

我正在使用WCF开发Rest Web服务。

我有以下合同:

    namespace ADM.Contracts
    {
        [DataContract]
        public class FormContract
        {
            [DataMember]
            public int FormId { get; set; }

            [DataMember]
            public string FormName { get; set; }

            [DataMember]
            public List<BlockContract> blocks { get; set; }
        }

}

有时,块为空,我发送此JSON:

[
    {
        "FormId": 1,
        "FormName": "Formulario 1",
        "blocks": null
    },
    {
        "FormId": 2,
        "FormName": "Formulario 2",
        "blocks": null
    },
    {
        "FormId": 3,
        "FormName": "Formulario 3",
        "blocks": null
    }
]

我可以避免发送"blocks": null吗?

我正在开发一个Android客户端来解析JSON数据。我该如何处理null

2 个答案:

答案 0 :(得分:6)

您应该能够通过添加到DataMember属性来避免发送列表成员的默认值(null)。

[DataMember(Name = "blocks", IsRequired=false, EmitDefaultValue=false)]
public List<BlockContract> blocks { get; set; }

但是,请记住,null是JSON中的有效值,并且应该在可能没有数据附加到您的实体时进行处理。你的javascript中可能更容易产生if条件,如:

for(var i = 0; i < data.length; ++i) {
   if (data[i].blocks != null) {
      //do stuff
   } else {
      //no blocks. do other stuff
   }
}

编辑:我想指出,如果你需要检查有问题的数据成员是否定义了一个阻止列表,你很可能必须选择后一个选项来检查阻塞成员是不为空。

答案 1 :(得分:0)

我看到了几个选项。

  1. 继续在JSON中发送空值并检查客户端的无效,并在那里处理它。

  2. 检查资源类中的无效并发送其他内容(空对象,带空字段的新对象,带占位符字段的对象)。

  3. 只是不要包含null的对象。 (即发送一个带有FormId和FormName字段但没有阻止字段的对象。)

  4. 无论您选择什么,在您的API中进行沟通非常重要,如果某些内容不存在,将会发生什么。并保持一致。