当前我有一个项目,我正在获取以下示例数据(我想只检索此json字符串中的ID并将它们填充到IEnumerables中(如下所述):
{
"states": [
{
"id": "AL",
"text": "Alabama (AL)"
},
{
"id": "CO",
"text": "Colorado (CO)"
}
],
"cities": [
{
"id": 71761,
"text": "New Brockton, AL"
},
{
"id": 74988,
"text": "Nathrop, CO"
}
],
"zipCodes": []
}
注意在zipcode中,我得到一个空集,所以没有“id”或“text”。
我希望能够从这个JSON字符串中找到的属性创建几个IEnumerables。
我创建了一个名为Locations的对象,如下所示:
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响应添加新属性时执行所有这些代码维护。事实上,我认为json字符串中会添加大约十个属性。
我希望它缩小到我可以更新Location对象的位置,并让json自动映射到属性。或者至少比我现在正在做的维护更少的解决方案。
此外,我想知道JsonConvert.DeserializeObject
是否适合我的情况;但是请注意JSON.NET将IEnumerable视为一个数组,所以我对这个问题感到难过。
答案 0 :(得分:1)
JsonConvert.DeserializeObject
可以适用于您的情况,它的维护费用将低于您现在所做的维护。
如果您将json数据输入http://json2csharp.com,下面是您可以使用的生成的类定义,我将RootObject
重命名为Location
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
将返回74988
。
如果json数据中有一个新属性,假设它的名字为countries
id
而text
就像states
一样,则可以创建一个新{{1} } class
Country
并将public class Country
{
public string id { get; set; }
public string text { get; set; }
}
属性添加到countries
类
Location