【问题标题】:How to appropriately deserialize dynamic JSON?如何适当地反序列化动态 JSON?
【发布时间】:2019-07-18 17:54:38
【问题描述】:

我有一个接受 JSON 的服务,作为将请求从浏览器转发到 Web 服务器到服务(也是 HTTP 服务器)的一部分,我有以下代码:

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、string、boolean 或 heck,甚至是数组),这将出错。

我尝试过简单地反序列化为 Object 类型,导致它被重新序列化为空数组的数组;可能是因为 Newtonsoft 的 JSON 序列化器默认将对象反序列化为 JObjects,这本质上是 KVP 的可枚举。

是否有一种与类型无关的方法可以从 Object 序列化到适当的类型,而无需编写一系列条件语句?

【问题讨论】:

    标签: c# json ajax json.net


    【解决方案1】:

    在这种情况下,更好的解决方案是将请求正文直接通过管道传输到 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。

    【讨论】:

      猜你喜欢
      • 2021-09-14
      • 2021-04-18
      • 2015-06-03
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      相关资源
      最近更新 更多