C# 使用JSON.NET反序列化对象,无需容器
我使用JSON.NET将从服务接收到的JSON字符串反序列化到我的业务对象 我有一个很好的服务模式,它将给定REST URL中的所有JSON字符串解析为一个对象,如下所示: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
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“,”财产“);