C# 使用JSON.NET反序列化对象,无需容器

C# 使用JSON.NET反序列化对象,无需容器,c#,json.net,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 re

我使用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;
}
public class Property
{
    [JsonProperty("id")]
    public string ID { get; set; }

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

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

}
我的业务实体如下:

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;
}
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");
LoadJSONToObject(“http://www.myapi.com/properties");
上述操作失败,因为JSON.NET需要一个容器对象。比如:

public class PropertyList 
{
    [JsonProperty("Properties")]
    public List<Property> Properties { get; set; }
}
公共类属性列表
{
[JsonProperty(“属性”)]
公共列表属性{get;set;}
}

我认为创建这样一个容器太过分了,我想看看是否有一个优雅的解决方案来完成上述操作。

如果您像这样重写
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(字符串url,字符串rootProperty)
{
//获取数据
var json=await GetResultStringAsync(url);
if(string.IsNullOrWhiteSpace(rootProperty))
返回JsonConvert.DeserializeObject(json);
var jObject=jObject.Parse(json);
var parsedJson=jObject[rootProperty].ToString();
//反序列化它
返回JsonConvert.DeserializeObject(parsedJson);
}
您的方法调用应该是

LoadJSONToObject<List<Property>>("http://www.myapi.com/properties", "Properties");
LoadJSONToObject(“http://www.myapi.com/properties“,”财产“);

如果您像这样重写
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(字符串url,字符串rootProperty)
{
//获取数据
var json=await GetResultStringAsync(url);
if(string.IsNullOrWhiteSpace(rootProperty))
返回JsonConvert.DeserializeObject(json);
var jObject=jObject.Parse(json);
var parsedJson=jObject[rootProperty].ToString();
//反序列化它
返回JsonConvert.DeserializeObject(parsedJson);
}
您的方法调用应该是

LoadJSONToObject<List<Property>>("http://www.myapi.com/properties", "Properties");
LoadJSONToObject(“http://www.myapi.com/properties“,”财产“);