如何在 .NET 6 和 Minimal API 中以 JSON 内容类型返回 JSON 字符串?

10
如果我有一个JSON字符串(例如从文件中读取),而我的API返回为字符串,Postman将把响应视为文本。
app.MapGet("/myapi", () =>
{
    var json = File.ReadAllText("file.json");
    return json;  
});

那么我如何强制指定内容类型为application/json?(请勿使用Newtonsoft) 我可以通过这种方法解决,但看起来很丑。
app.MapGet("/myapi", () =>
{
    var json = File.ReadAllText("file.json");
    var jo = JsonSerializer.Deserialize<object>(json);
    return Results.Json(jo);
});

感谢。
2个回答

12

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

Results.Json()是返回Json的正确响应。我认为,你的第二种技术并不“丑陋”,而是读取和反序列化Json的正确方式。不要担心将Json反序列化为对象再次序列化的性能问题,如果这成为问题,您可以在那时解决它。如果需要修改json然后返回它怎么办?在那种情况下仍然需要将其反序列化。

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

var jo = JsonSerializer.Deserialize<CustomClass>(json);

解决方法

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

return Results.Text(json, contentType: "application/json");

这会在Postman中产生与以下代码相同的结果:

return Results.Json(jo);

3
Results.Json 会再次对字符串进行编码,因此如果“jo”已经是一个 JSON 编码的字符串,则输出可能不符合预期。Results.Text 不会改变字符串的值。 - pbz
1
如果您使用NewtonsoftJson,例如:JsonConvert.SerializeObject(someObject),那么您需要使用Result.Text(json, "application/json")。否则,JSON将再次从Result.Json(..)进行编码,就像在先前的评论中提到的那样,它将不正确。 - Florent
感谢Results.Text()的帮助! - JohnyL

3

正确答案是:

return Results.Text(json, contentType: "application/json");

@haldo的答案是不正确的,因为他声称这是一种解决方法,但实际上并不是。您已经有了JSON,并且希望输出相同的JSON而不进行修改,您只需要告诉浏览器这是JSON即可。因此,这里没有任何解决方法,只有正确的输出JSON内容的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接