2015-02-10 40 views
0

我正在解析由第三方返回的JSON數據。如何忽略JSON.NET中返回的數據變化

我與JSON2CSharp它適用於我們收到的第一個樣品產生我的課。我調整它有一些JsonProperty設置,以便它不需要某些不總是存在的屬性。

現在,我獲得了更多的樣本和datablobs的一個改變了形式

從需要

public Translations Translations { get; set; } 

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

團塊不過是我們不需要的信息,無論是性能而不必處理那些和其他信息我們不需要改變格式,所以在反序列化時忽略它是理想的。

現在真正的問題是,應該「JsonIgnore」忽略數據irregardless整個BLOB,如果它是在一個不同的格式,然後在類中定義?還是我必須圍繞這一點編程?

所以,如果我做

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

將它也忽略翻譯時,它被髮送列表或一個對象?

我能用JsonIgnore相同的語法,我可以用JsonProperty,只是說

[JsonIgnore(PropertyName = "translations")] 

或不JsonIgnore只是折騰出什麼收到?

另外一個問題:

它是慣例,在沒有翻譯,我得到:

"translations":[] 

當有翻譯,我得到:

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

或者,這是有可能第三方網站中的錯誤?

ADDED:

1:翻譯可以在每次獲取JSON的之間串,列表和對象切換。

2:爲了使用DataMembers忽略所有我實際上不需要的東西,在具有子類的類中,是否必須告訴它子類是[DataMember]還是子類屬性是[DataMember]?

回答

0

我會明確地指定我想在我的數據類中使用DataContractAttributeDataMemberAttribute s對您想要反序列化的成員序列化/反序列化的屬性。

這是選擇的,所以沒有嘗試任何東西硬塞進你的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); 
+0

的問題是,取之間,會員可以發巫婆之間作爲一個對象和一個列表和一個簡單的字符串。 但是,如果我正確地理解它,無論使用什麼格式,使用DataMembers時,它會忽略任何未定義爲成員的東西? 如果您使用子類會怎麼樣? – Enlightend 2015-02-10 15:22:51

+0

@Enlightend由於'Translations'在反序列化過程中被完全忽略,所以我不清楚爲什麼它會在對象之間進行切換。 – 2015-02-10 15:25:30

+0

這是我需要知道的。如果它完全被忽略,所有的答案都是完美的! – Enlightend 2015-02-10 15:28:32