如何忽略 JSON.NET 中在 returns 之间变化的数据
How to ignore data in JSON.NET that changes between returns
我正在由第三方解析 JSON 数据 return。
我的 class 使用 JSON2CSharp 生成,它适用于我们收到的第一个样本。我对其进行了调整,使其具有一些 JsonProperty 设置,这样它就不需要某些并不总是存在的属性。
现在我收到了更多样本,其中一个数据块的格式发生了变化
从需要
public Translations Translations { get; set; }
至
public List<Translations> Translations { get; set; }
然而,blob 是我们不需要的信息,为了性能和不必处理它以及我们不需要更改格式的其他信息,最好在反序列化时忽略它。
现在真正的问题是,"JsonIgnore" 是否应该忽略整个数据块,而不管它的格式是否与 class 中定义的格式不同?还是我必须围绕它进行编程?
所以如果我这样做
[JsonIgnore]
public string Translations { get; set; }
当收到列表或对象时,它是否也会忽略翻译?
我可以在 JsonIgnore 中使用与在 JsonProperty 中使用的语法相同的语法,然后只说
[JsonIgnore(PropertyName = "translations")]
或者 JsonIgnore 只是扔掉它收到的任何东西?
另外问题:
如果没有翻译,我会得到:
"translations":[]
当有翻译时,我得到:
"translations":{"CA":"blabla","DD":"C : blablah"}
或者这可能是第三方网站的错误?
已添加:
1:Translations 可以在 JSON 的每次提取之间在字符串、列表和对象之间切换。
2:为了使用 DataMembers 忽略我实际上不需要的一切,在带有 subclasses 的 class 中,我是否必须告诉它 subclass 是[DataMember] 或子classes 属性是[DataMember]?
我会在我的数据 class 中明确指定我想要的属性 serialized/deserialized,使用 DataContractAttribute
和 DataMemberAttribute
s 作为您实际想要反序列化的成员。
这是选择加入,因此不会尝试将您的 JSON 中的任何额外内容塞入您的数据 class,并且您的数据 class 中的任何额外内容都不会显示在连载中 JSON.
所以假设你的 class 现在看起来像这样:
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);
我正在由第三方解析 JSON 数据 return。
我的 class 使用 JSON2CSharp 生成,它适用于我们收到的第一个样本。我对其进行了调整,使其具有一些 JsonProperty 设置,这样它就不需要某些并不总是存在的属性。
现在我收到了更多样本,其中一个数据块的格式发生了变化
从需要
public Translations Translations { get; set; }
至
public List<Translations> Translations { get; set; }
然而,blob 是我们不需要的信息,为了性能和不必处理它以及我们不需要更改格式的其他信息,最好在反序列化时忽略它。
现在真正的问题是,"JsonIgnore" 是否应该忽略整个数据块,而不管它的格式是否与 class 中定义的格式不同?还是我必须围绕它进行编程?
所以如果我这样做
[JsonIgnore]
public string Translations { get; set; }
当收到列表或对象时,它是否也会忽略翻译?
我可以在 JsonIgnore 中使用与在 JsonProperty 中使用的语法相同的语法,然后只说
[JsonIgnore(PropertyName = "translations")]
或者 JsonIgnore 只是扔掉它收到的任何东西?
另外问题:
如果没有翻译,我会得到:
"translations":[]
当有翻译时,我得到:
"translations":{"CA":"blabla","DD":"C : blablah"}
或者这可能是第三方网站的错误?
已添加:
1:Translations 可以在 JSON 的每次提取之间在字符串、列表和对象之间切换。
2:为了使用 DataMembers 忽略我实际上不需要的一切,在带有 subclasses 的 class 中,我是否必须告诉它 subclass 是[DataMember] 或子classes 属性是[DataMember]?
我会在我的数据 class 中明确指定我想要的属性 serialized/deserialized,使用 DataContractAttribute
和 DataMemberAttribute
s 作为您实际想要反序列化的成员。
这是选择加入,因此不会尝试将您的 JSON 中的任何额外内容塞入您的数据 class,并且您的数据 class 中的任何额外内容都不会显示在连载中 JSON.
所以假设你的 class 现在看起来像这样:
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);