如何适当地反序列化动态JSON?

时间:2019-07-18 17:54:38

标签: c# json ajax json.net

我有一个接受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获取序列化为适当的类型,而不必编写一系列条件语句?

1 个答案:

答案 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。