使用JSON.NET将子数据集反序列化为ienumerables

时间:2014-02-19 19:49:37

标签: c# json json.net ienumerable

当前我有一个项目,我正在获取以下示例数据(我想只检索此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视为一个数组,所以我对这个问题感到难过。

1 个答案:

答案 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 idtext就像states一样,则可以创建一个新{{1} } class

Country

并将public class Country { public string id { get; set; } public string text { get; set; } } 属性添加到countries

Location