使用JSON.NET反序列化对象而无需容器

时间:2013-12-08 00:22:36

标签: c# json.net

我正在使用JSON.NET将从服务收到的JSON字符串解析为我的业务对象。

我有一个很好的服务模式,可以将给定REST URL中的所有JSON字符串解析为对象,如下所示:

private async Task<T> LoadJSONToObject<T>(string url)
{
    //get data
    var json = await GetResultStringAsync(url);

    //deserialize it
    var results = JsonConvert.DeserializeObject<T>(json);
    return results;
}

我遇到的挑战是如何在不创建“容器”类的情况下将上述模式用于集合。

例如,如果我收到以下JSON:

{
    "Properties": [
        {
            "id": 1,
            "name": "Property Name A",
            "address": "Address A, City, Country",
        },
        {
            "id": 2,
            "name": "Property Name B",
            "address": "Address B, City, Country",
        }
    ]
}

我的业务实体如下:

public class Property
{
    [JsonProperty("id")]
    public string ID { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("address")]
    public string Address{ get; set; }

}

我想通过调用:

简单地调用我的上述方法
LoadJSONToObject<List<Property>>("http://www.myapi.com/properties");

上面的失败是因为JSON.NET正在期待一个容器对象。类似的东西:

public class PropertyList 
{
    [JsonProperty("Properties")]
    public List<Property> Properties { get; set; }
}

我认为创建这样一个容器并且想要看看是否有一个优雅的解决方案来完成上述操作是一种过度的做法。

1 个答案:

答案 0 :(得分:1)

如果你像这样重写LoadJSONToObject,那么你可以做到这一点:

private async Task<T> LoadJSONToObject<T>(string url, string rootProperty)
{
    //get data
    var json = await GetResultStringAsync(url);

    if (string.IsNullOrWhiteSpace(rootProperty))
        return JsonConvert.DeserializeObject<T>(json);

    var jObject = JObject.Parse(json);

    var parsedJson = jObject[rootProperty].ToString();

    //deserialize it
    return JsonConvert.DeserializeObject<T>(parsedJson);
}

你的方法调用应该是

LoadJSONToObject<List<Property>>("http://www.myapi.com/properties", "Properties");
相关问题