2017-08-30 271 views
1

我有一個JSON字符串,看起來與此類似:反序列化JSON選擇對象從JSON字符串

{ 
    "automatic" : "true", 
    "brainstorm" : "1000", 
    "zombies" : [{ "Name" : "Fred", "Grrh" : "50" }, { "Name" : "Sally", "Grrh" : "67" }, { "Name" : "Chris", "Grrh" : "23" }], 
    "nightSkyRadius" : "30" 
    ... could be anything here or at the same level as zombies ... 
} 

所以,在我的情況,我知道數組中的殭屍對象將始終是相同的。但除此之外我什麼都不知道。也就是說,可以有與zombies值相同的任意數量的值。

所以我的問題是,我如何使用Json.NET反序列化只有我的zombies?我不知道其他值是什麼(如果值是正確的術語),所以我不能只創建一個描述傳入的Json字符串的對象。所以我想我可以從json字符串中選擇zombies,然後反序列化它。

但是,我想,我不得不寫一個字符串解析器,將zombies .. ..這似乎是一個額外的不必要的步驟。不能Json.NET爲我做這個?

此外,我試過JsonConvert.DeserializeObject<dynamic>(responseString);,但只能處理在響應字符串中指定了一個殭屍的情況。

謝謝,我希望zombies使這個問題似乎冷卻器笑

回答

1

創建一個殭屍類和解析JSON成。 Newtonsoft是足夠聰明,它爲您

public class zombies 
{ 
    public string Name; 
    public int Grrh; 
} 

現在解碼,你可以做

var zombies = JsonConvert.DeserializeObject<List<zombies>>(responseString); 
+0

我現在的代碼庫要求列表在'JToken's中,你知道我該如何得到列表嗎?表示「殭屍」對象的'JToken'。 – visc

+1

就我個人而言,我不認爲你正在使用JTokens來幫助你,因爲它只有當你不確定它裏面會發生什麼時纔會使用它。既然你只想將殭屍對象反序列化爲一個已定義的對象,將會使它更容易處理。https://stackoverflow.com/questions/38211719/json-net-why-use-jtoken-ever –

+0

對,但在我的情況下,我不能完全改變實現。雖然好點。編輯:我正在使用'JToken' – visc

1

如果您只需要殭屍的陣列可以與殭屍只有一個自動屬性數組簡單的反序列化對象

public class Zombie { 
public string Name {get;set;} 
public string Grrh {get;set;} 
} 

public class Zombies { 
public IEnumerable<Zombie> ZombieCollection {get;set;} 
} 

然後

JsonConvert.DeserializeObject<Zombies>(responseString) 
1

你可以將整個Json對象傳入一個只有一個殭屍列表的對象作爲它的集合。指定JsonPropertyAttribute它只會反序列化殭屍屬性,並忽略它不能映射到對象上的東西。

假設一個殭屍類:

public class Zombie 
{ 
    public string Name { get; set; } 
    public string Grrh {get; set; } 
} 

和一個類來保存整個JSON對象(這也只是殭屍集合)

public class MyZombieJsonData 
{ 
    [JsonProperty(PropertyName = "zombies")] 
    public List<Zombie> ZombieList { get; set; } 
} 

那麼無論你有機會獲得JSON字符串,你可以這樣做:

JsonConvert.DeserializeObject<MyZombieJsonData>(theJsonDataAsAString); 

其中theJsonDataAsAString是整個JSON數據,在包括你不知道的東西,而不想反序列化,作爲一個字符串類型。

+0

'JsonProperty' – visc