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



Current我有一个项目,在那里我得到了以下样本数据(我只想检索这个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": []
}

请注意,在zipCodes中,我得到了一个空集,因此没有"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视为数组,所以我对此感到困惑。

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中一样,你可以创建一个新的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; }
}

相关内容

  • 没有找到相关文章

最新更新