我可以 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);
在 .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);