动态地反序列化JSON.net

时间:2015-06-24 13:48:09

标签: c# json json.net

我有一个透明代理,可以在前台和后台之间进行请求,我的透明代理有4种方法(GET,POST,PUT,DELETE),可以动态地向多个服务发出请求。
我的问题是我不能根据响应反序列化列表或对象。

一个对象:

var client = new WebClient { UseDefaultCredentials = true };
client.Headers.Add(HttpRequestHeader.ContentType, "application/json; charset=utf-8");
var result = JsonConvert.DeserializeObject<Dictionary<String, Object>>(Encoding.UTF8.GetString(client.DownloadData(ConfigurationManager.AppSettings["InternalWebApiUrl"] + "/" + url)));

return Request.CreateResponse(result);

对象列表

var client = new WebClient { UseDefaultCredentials = true };
client.Headers.Add(HttpRequestHeader.ContentType, "application/json; charset=utf-8");
var result = JsonConvert.DeserializeObject<List<Object>>(Encoding.UTF8.GetString(client.DownloadData(ConfigurationManager.AppSettings["InternalWebApiUrl"] + "/" + url)));

return Request.CreateResponse(result);

有没有办法验证响应是数组还是只有一个对象?

2 个答案:

答案 0 :(得分:2)

您可以先使用JToken.Parse解析JSON,然后确定您要处理的内容:

JToken token = JToken.Parse(json);

if (token.Type == JTokenType.Object)
{
    Dictionary<string, object> d = token.ToObject<Dictionary<string, object>>();
}
else if (token.Type == JTokenType.Array)
{
    List<object> list = token.ToObject<List<object>>();
}

或者,如果您实际上并不关心自己在做什么,可以使用JToken

答案 1 :(得分:2)

试试这个!

var client = new WebClient { UseDefaultCredentials = true };

client.Headers.Add(HttpRequestHeader.ContentType, "application/json; charset=utf-8");
var result = JsonConvert.DeserializeObject<Object>(Encoding.UTF8.GetString(client.DownloadData(ConfigurationManager.AppSettings["InternalWebApiUrl"] + "/" + url)));

return Request.CreateResponse(result);