2014-02-19 87 views
2

當前我有一個項目,獲取以下示例數據(我只想檢索此json字符串中的id並將它們填充到IEnumerables中(如下所述):使用JSON.NET將子數據集合反序列化爲數據集合

在拉鍊碼
{ 
    "states": [ 
    { 
     "id": "AL", 
     "text": "Alabama (AL)" 
    }, 
    { 
     "id": "CO", 
     "text": "Colorado (CO)" 
    } 
    ], 
    "cities": [ 
    { 
     "id": 71761, 
     "text": "New Brockton, AL" 
    }, 
    { 
     "id": 74988, 
     "text": "Nathrop, CO" 
    } 
    ], 
    "zipCodes": [] 
} 

通知,我得到一個空集,因此不存在「ID」或「文本」。

我希望能夠創建一個從這個JSON中發現的性質幾個IEnumerables字符串

我創建了一個名爲Location的對象,就是看這樣的:

public class Location 
{ 
    public IEnumerable<string> States { get; set; } 
    public IEnumerable<string> ZipCodes { get; set; } 
    public IEnumerable<decimal> Cities { get; set; } 
} 

我發現要對這個辦法的最好辦法是通過一個做每個數據屬性之一,轉換,formValues是JSON字符串:

JArray arrStates = (JArray)formValues["states"]; 
JArray arrCities = (JArray)formValues["cities"]; 
JArray arrZip = (JArray)formValues["zipCodes"]; 

,然後在設定的位置對象的屬性是這樣:

Location loc = new Location(); 
loc.States = arrStates.Children().Select(m=>m["id"].Value<string>()); 
loc.ZipCodes = arrCities.Children().Select(m=>m["id"].Value<string>()); 
loc.Cities = arrZip.Children().Select(m=>m["id"].Value<string>()); 

我想知道是否有這樣做的,而不是做所有每當我的JSON響應增加了一個新的p此代碼維護的一個更好的辦法roperty。實際上,我認爲將會有約10個屬性添加到json字符串中。

我希望將它縮小到我可以更新Location對象的位置,並讓json自動映射到屬性。或者至少有一個解決方案比我現在做的維護更少。

另外我想知道JsonConvert.DeserializeObject是否適用於我的情況;但閱讀JSON.NET對待一個IEnumerable作爲一個數組,所以我難住這一個。

回答

1

JsonConvert.DeserializeObject會在你的情況下工作,它會比你現在做的更少的維護。

如果您輸入您的JSON數據http://json2csharp.com,下面是生成的類定義,你可以用,我改名RootObjectLocation

public class State 
{ 
    public string id { get; set; } 
    public string text { get; set; } 
} 

public class City 
{ 
    public int id { get; set; } 
    public string text { get; set; } 
} 

public class Location 
{ 
    public List<State> states { get; set; } 
    public List<City> cities { get; set; } 
    public List<object> zipCodes { get; set; } 
} 

這是你如何反序列化JSON數據到Location

string jsonData = ...; // set the json data here 

var location = JsonConvert.DeserializeObject<Location>(jsonData); 

您可以通過嵌套屬性來枚舉以獲得ID,例如location.states[0].id將返回"AL"location.cities[1].id將retu 74988

如果有一個在JSON數據的新特性,比方說,它的命名countriesidtextstates,你可以創建一個新的Country

public class Country 
{ 
    public string id { get; set; } 
    public string text { get; set; } 
} 

,並添加countries屬性Location

public class Location 
{ 
    public List<State> states { get; set; } 
    public List<City> cities { get; set; } 
    public List<object> zipCodes { get; set; } 
    public List<Country> countries { get; set; } 
}