【问题标题】:Response JObject values not completely filled in returned JSON返回的 JSON 中未完全填充的响应 JObject 值
【发布时间】:2021-06-06 04:25:58
【问题描述】:

来自 JObject 内容的响应输出在应用程序中格式不正确。

将问题缩小到可能的最小规模,应该缺少一些导致此行为的细节(极不可能是其他原因)。

以下代码显示了一个 JSON 有效负载作为来自 API 端点的响应:

    [HttpPost]
    public async Task<ObjectResult> Post()
    {
      var json = JsonConvert.DeserializeObject<JObject>(
        @"{""parameter-1"":""J234546ZrVl"",""value-2"":""3E9CY3gertertmdALWMmHkvP"",""test-3"":""verify please""}");
      var result = new ObjectResult(json);

      return result;
    }

收到的响应如下:

  {"parameter-1":[],"value-2":[],"test-3":[]}

应该是:

  {"parameter-1":"J234546ZrVl","value-2":"3E9CY3gertertmdALWMmHkvP","test-3":"verify please"}

调试时变量json 是正确的,并且具有所有属性值,但不知何故它没有正确呈现。

有什么想法吗?

  • 这是使用:ASP Net Core 5.0
  • ObjectResult 定义在:namespace Microsoft.AspNetCore.Mvc
  • 它的构造函数是:public ObjectResult(object value);
  • 并具有接口:

public class ObjectResult : ActionResult, IStatusCodeActionResult, IActionResult

【问题讨论】:

  • 请提供更多背景信息 - 您正在使用哪些精确的服务器技术(包括版本)?你是如何配置序列化的? minimal reproducible example 是理想的选择。
  • 很可能,ObjectResult 不理解 JObject 中的动态处理。
  • 您很可能正在使用 asp.net-core 3.0 或更高版本,并且默认使用 System.Text.Json 而不是 Json.NET。您的症状与How can I serialize a Newtonsoft JToken to JSON using System.Text.Json? 的症状相似。要切换回 Json.NET,请参阅 Where did IMvcBuilder AddJsonOptions go in .Net Core 3.0?。如果这不是问题,请提供有关如何重现问题的更多详细信息,包括您正在使用的框架和库版本。
  • ObjectResult 的内容是什么?你为什么需要它?您可以将“json”或 DeserializeObject 直接返回给“ObjectResult”。请在问题中添加“ObjectResult”类。
  • 如果您使用的是 asp.net-core-5,最简单的方法是将JObject 替换为JsonElement,即var json = System.Text.Json.JsonSerializer.Deserialize&lt;JsonElement&gt;(jsonString);。请参阅:Equivalent of JObject in System.Text.Json

标签: c# http json.net asp.net-core-5.0


【解决方案1】:

感谢dbc 的提示,我们可以使用旧版服务,只需使用之前的 Newtonsoft.Json 库序列化其返回值并使用新的 System.Text.Json。

这种方法可以解决问题,并且可以在整个应用程序中使用,可能对于非常大的 JSON 值来说不是最佳选择,但对于我们的要求来说是干净和精简的。

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Text.Json;

...

  public static JsonDocument JToken2JsonDocument(JToken input)
  {
    var jsonString = JsonConvert.SerializeObject(input);
    var json = JsonDocument.Parse(jsonString);
    return json;
  }

可以使用返回的对象调用 ObjectResult 构造函数并正确渲染。

【讨论】:

  • JsonDocument* 实现IDisposable未能正确处置此对象将导致内存未返回到池中,这将增加跨框架各个部分的 GC 影响。 最好克隆 RootElement,处置文档,然后返回克隆。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多