我有一个接受JSON的服务,作为将请求从浏览器转发到Web服务器到服务(也就是HTTP Server)的一部分,我有以下代码:
if (Request.HttpMethod.ToLower() == "post")
{
var jsonObj = ObjectFromRequestBody<Dictionary<string, string>>();
if (jsonObj != null)
{
// uses Newtonsoft JSON Serializer to re-serialize the object; this is RestSharp
requestToForward.AddJsonBody(jsonObj);
}
}
ObjectFromRequestBody看起来像这样:
protected T ObjectFromRequestBody<T>()
{
Stream requestStream = Request.InputStream;
requestStream.Seek(0, SeekOrigin.Begin);
string json = new StreamReader(requestStream).ReadToEnd();
var payload = JsonConvert.DeserializeObject<T>(json);
return payload;
}
现在,假设它是一个发布的JSON对象,则可以正常工作。 (KVP集合)
但是,我想在有效负载只是一个值(int,字符串,布尔值或heck,甚至是数组)的情况下,这会出错。
我尝试过简单地反序列化为一种Object类型,导致将其重新序列化为一个空数组;可能是因为默认情况下,Newtonsoft的JSON序列化器将对象反序列化为JObjects,而JObjects实际上是KVP的枚举。
是否有一种与类型无关的方法,可以从Object获取序列化为适当的类型,而不必编写一系列条件语句?
答案 0 :(得分:0)
在这种情况下,更好的解决方案是简单地将请求主体直接传递到RestSharp请求中。
if (Request.HttpMethod.ToLower() == "post")
{
var requestBody = new StreamReader(Request.InputStream).ReadToEnd();
if (!string.IsNullOrWhiteSpace(requestBody))
{
request.AddHeader("Content-Type", "application/json");
request.AddParameter("", requestBody, RestSharp.ParameterType.RequestBody);
}
}
尽管如此,仍然有兴趣了解如何正确地类型无关地序列化JObject。