如何忽略JSON.NET中返回之间更改的数据

时间:2015-02-10 15:02:37

标签: c# json deserialization

我正在解析第三方返回的JSON数据。

我的JSON2CSharp生成了我的类,它适用于我们收到的第一个样本。我把它调整为有一些JsonProperty设置,这样它就不需要某些并不总是存在的属性。

现在我收到了更多样本,其中一个数据库改变了格式

需要

public Translations Translations { get; set; }

public List<Translations> Translations { get; set; }
然而,blob是我们不需要的信息,对于性能而不必处理那些以及我们不需要改变格式的其他信息,在反序列化时忽略它是理想的。

现在真正的问题是,应该&#34; JsonIgnore&#34;如果它是在类中定义的不同格式,则忽略整个数据块无论如何?或者我必须围绕它编程吗?

所以如果我这样做

[JsonIgnore]
public string Translations { get; set; }

它会在发送列表或对象时忽略翻译吗?

我可以和JsonProperty一样使用与JsonIgnore相同的语法,只需说

[JsonIgnore(PropertyName = "translations")]

或者JsonIgnore只是扔掉了收到的东西吗?

另外问题:

如果没有翻译,我会得到:

"translations":[]

当我得到翻译时:

"translations":{"CA":"blabla","DD":"C : blablah"}

或者这可能是第三方网站的错误?

增加:

1:Translations可以在每次获取JSON之间切换字符串,列表和对象。

2:为了使用DataMembers忽略我实际上不需要的所有内容,在具有子类的类中,我是否必须告诉它子类是[DataMember]还是子类属性是[DataMember]?

1 个答案:

答案 0 :(得分:0)

我会使用DataContractAttributeDataMemberAttribute为您实际想要反序列化的成员明确指定我想要在我的数据类中序列化/反序列化的属性。

这是选择加入,因此不会尝试将JSON中的任何额外内容添加到您的数据类中,并且数据类中的任何额外内容都不会显示在序列化的JSON中。

所以假设你的班级现在看起来像这样:

class MyData {
    // Old member
    // public Translations Translations { get; set; }

    public List<Translation> Translations { get; set; }

    public string ThisShouldBeSerialized { get; set; }
}

您可以对其进行更改,以便明确标记要序列化的内容,默认情况下会忽略未标记为序列化的内容:

[DataContract]
class MyData {
    // Old member
    // public Translations Translations { get; set; }

    public List<Translation> Translations { get; set; }

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

然后:

var myJSON = @"{ 
    'ThisShouldBeSerialized': 'test', 
    'Translations': { 
         'Some' : 'Strange', 
         'Data' : 'Blob' 
     }
}";

var result = JsonConvert.DeserializeObject<MyData>(myJSON);