【问题标题】:Can I return formated json inside a stream [closed]我可以在流中返回格式化的 json [关闭]
【发布时间】:2021-02-05 19:48:49
【问题描述】:

在 .netcore 3.1 中,我有返回流的 Web API 端点。 我用 Json 字符串填充流。我可以在浏览器上显示缩进文本吗

在 Starup.cs 和我的配置服务方法中:

services.AddControllers()
            .AddNewtonsoftJson(options =>
                options.SerializerSettings.Formatting = Formatting.Indented);

在控制器中:

[HttpGet]
public Stream Get()
{
        // Receiving a string and not an object. 
        // the shape  of the object is unknown to me 
        string test = "{ \"mydata\":[{ \"data\":[{ \"x\":1,\"y\":0}],\"frq]\":12}],\"success\":true,\"error_message\":\"\"}";
        string pretty = JsonConvert.SerializeObject(test,Formatting.Indented);
        return new MemoryStream(System.Text.Encoding.UTF8.GetBytes(test));
}

我使用 Visual Studio 调试器、JSON 查看器而不是文本检查了“漂亮”变量,我注意到放置的是 \" 而不是 \r\n

我正在使用 Newtonsoft.Json

我安装了 Microsoft.AspNetCore.Mvc.NewtonsoftJson v3.1.9

【问题讨论】:

  • 在客户端做格式。格式化会消耗额外的数据,并且通常不需要计算机消耗。仅当您打算向最终用户显示格式时才应用格式。
  • @Alejandro 我的 Helperclass 方法正在将流返回到我的控制器,我该如何格式化这个流。我应该更改我的 herlper 方法以返回 json 吗?
  • 能把序列化对象字符串的内容贴出来吗?
  • @Alejandro 更新了问题
  • @Brain Rogers。这是一个证明“漂亮”没有被格式化的测试

标签: c# asp.net-web-api json.net .net-core-3.1


【解决方案1】:

更新

因此,根据您提供的代码示例,您只想格式化现有的 json。您可以通过将其解析为 JObject 并返回到 json 来实现:

string test = "{ \"mydata\":[{ \"data\":[{ \"x\":1,\"y\":0}],\"frq]\":12}],\"success\":true,\"error_message\":\"\"}";
var jObject = JObject.Parse(test);
var stream = new MemoryStream();
jObject.WriteTo(new JsonTextWriter(new StreamWriter(stream)));
return stream;

原始答案

.AddJsonOptions 为控制器操作返回的对象配置序列化程序。如果你想返回格式化的字符串,你应该为序列化器提供一个格式化选项:

string test = JsonConvert.SerializeObject(response, Formatting.Indented);

例如,如果我尝试序列化您在示例中提供的对象

var response = new
{
    mydata = new object[]
    {
        new
        {
            data = new object[]
            {
                new { x = 1 },
                new { y = 0 }
            },
            frq = 12
        }
    },
    success = true,
    error_message = ""
};

var json = JsonConvert.SerializeObject(response, Formatting.Indented);

我得到以下结果:

"{\r\n  "mydata": [\r\n    {\r\n      "data": [\r\n        {\r\n          "x": 1\r\n        },\r\n        {\r\n          "y": 0\r\n        }\r\n      ],\r\n      "frq": 12\r\n    }\r\n  ],\r\n  "success": true,\r\n  "error_message": ""\r\n}"

所以序列化按预期工作。您没有指定观察结果的方式和位置。可能是客户端或浏览器修剪了字符串,这就是您看不到格式的原因。

顺便说一句,如果您使用Newtonsoft.Json,请考虑将其注册为 ASP.NET Core 序列化:

services
    .AddControllers()
    .AddNewtonsoftJson(options =>
        options.SerializerSettings.Formatting = Formatting.Indented);

【讨论】:

  • 试过了,但没有成功。在我看来,格式没有生效
  • 您能在问题中发布您尝试过的内容吗?您用于 json 序列化的库是什么?看来您使用的是 Newtonsoft.Json。以及如何验证字符串中的 json 未格式化?您还可以发布字符串存储的示例值吗?
  • ..更新了问题
  • 我已经更新了答案。
  • 字符串 test = JsonConvert.SerializeObject(response, Formatting.Indented);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 2021-10-08
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
相关资源
最近更新 更多