如何在 net 6 和最小 api 中返回内容类型为 json 的 json 字符串?

San*_*Riz 11 c# json asp.net-core minimal-apis

如果我有一个 json 字符串(例如从文件中读取)并且我的 api 以字符串形式返回,Postman 会将响应视为文本

app.MapGet("/myapi", () =>
{
    var json = File.ReadAllText("file.json");
    return json;  
});
Run Code Online (Sandbox Code Playgroud)

那么如何强制内容类型为 application/json 呢?(请不要使用 Newtonsoft)我能够使用该解决方法,但看起来很丑

app.MapGet("/myapi", () =>
{
    var json = File.ReadAllText("file.json");
    var jo = JsonSerializer.Deserialize<object>(json);
    return Results.Json(jo);
});
Run Code Online (Sandbox Code Playgroud)

谢谢

hal*_*ldo 14

您的“解决方法”是从最小 API 返回 Json 的正确方法。请参阅类中可用的方法Results以获取可用响应的完整列表。

Results.Json()是返回Json的正确响应。IMO,你的第二种技术并不“丑陋”,而是读取和反序列化 Json 的正确方法。不必担心将 Json 反序列化为对象只是为了再次序列化它的性能 - 如果它成为问题,您可以在此时解决它。如果返回之前需要修改json怎么办?无论如何,在这种情况下你需要反序列化它。

我还要补充一点,理想情况下,您应该反序列化为定义的类,而不是object

var jo = JsonSerializer.Deserialize<CustomClass>(json);
Run Code Online (Sandbox Code Playgroud)

解决方法

但是,您可以使用Results.Text()并指定内容类型:

return Results.Text(json, contentType: "application/json");
Run Code Online (Sandbox Code Playgroud)

在 Postman 中产生相同的结果:

return Results.Json(jo);
Run Code Online (Sandbox Code Playgroud)

  • Results.Json 再次对字符串进行编码,因此如果“jo”已经是 json 编码的字符串,则输出可能不是人们所期望的。Results.Text 不会更改字符串值。 (3认同)