我可以 return 在流中格式化 json

Can I return formated json inside a stream

在 .netcore 3.1 中,我有网络 API 端点,returns 一个流。 我用 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 查看器而不是文本检查了 'pretty' 变量,我注意到放置的是 \" 而不是 \r\n

我正在使用 Newtonsoft.Json

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

更新

因此,根据您提供的代码示例,您只想格式化现有 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 为从控制器操作 return 编辑的对象配置序列化程序。如果你想 return 格式化字符串,你应该为序列化程序提供一个格式化选项:

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核心序列化注册它:

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