序列化为JSON时忽略DataMember

时间:2016-04-25 16:29:19

标签: json vb.net serialization datacontractjsonserializer

我已将DataMemeber添加到我的对象属性,以在序列化为JSON时更改设置,但是它没有使用它们。我试图更改名称,以及发出默认值。

我尝试这样做的原因是我想忽略一个属性,如果它是默认值。

我正在尝试使用Microsoft库而不是Newtonsoft库。

    <DataMember(EmitDefaultValue:=True, IsRequired:=False, Name:="addressTable")> Public Property addressTable() As String
        Get
            Return _AddressTable
        End Get
        Set(ByVal value As String)
            _AddressTable = value
        End Set
    End Property


Public Function gObjToStr(ByVal InputObject As Object) As String

    Dim stream1 As New IO.MemoryStream
    Dim ser As Runtime.Serialization.Json.DataContractJsonSerializer = New Runtime.Serialization.Json.DataContractJsonSerializer(InputObject.GetType)

    ser.WriteObject(stream1, InputObject)
    stream1.Position = 0

    Dim sr As New IO.StreamReader(stream1)
    Dim OutString As String = Nothing

    Return sr.ReadToEnd

End Function

1 个答案:

答案 0 :(得分:0)

您需要从属性EmitDefaultValue中删除addressTable属性。

基本上,EmitDefaultValue 告诉序列化引擎是否序列化要序列化的字段或属性的默认值

EmitDefaultValue的默认值为true,因此即使属性具有默认值,也会将其序列化。根据您的要求,如果您需要忽略属性,如果它具有默认值,则需要将属性EmitDefaultValue添加到属性并将值设置为false [DataMember(EmitDefaultValue =false)]。在上面发布的代码中,您设置了EmitDefaultValue = true,因此它在序列化中生成了addressTable

此外,IsRequired 指示序列化引擎在读取或反序列化时必须存在该成员。所以你应该小心使用属性EmitDefaultValue和&amp; IsRequiredIsRequired = false的默认值。因此,您不能拥有EmitDefaultValue=falseIsRequired=true这样的组合,在这种情况下,序列化引擎会抛出异常。