【问题标题】:Newtonsoft serialization vs ASP.NET serializationNewtonsoft 序列化与 ASP.NET 序列化
【发布时间】:2017-03-08 18:42:56
【问题描述】:

如果我有一个简单的类:

public class UserId
{
    public string Id { get; set; }
}

我将它传递给 HttpRequest.CreateResponse() 输出是:

{ "id": "1234bcf6678" }

但是,如果我使用 JsonSerializer,我会得到:

"{ \"id\": \"1234bcf6678\" }"

我知道第二个实际上是一个 json 字符串,但是我如何使用 JsonSerializer 并将结果从它传递给 HttpRequest.CreateResponse() 以获取第一个输出(即没有转义引号)?

我知道有一个关于 SO 的相关问题,但我想使用 Newtonsoft 序列化程序,因为它允许我正确处理序列化一些通用列表和派生对象。

对于额外的上下文,可能值得知道我在 Azure Functions 中执行此操作。我看到 Web API 有 System.Web.Http.GlobalConfiguration 可用,但不确定功能是否可用。

【问题讨论】:

  • ASP.Net内部使用Json.net,可以在应用启动时配置。您能否更具体地说明 ASP.Net 未返回正确输出的情况?
  • 我刚刚进行了编辑。这是在 Azure Functions 中,所以我不确定通过 GlobalConfiguration 是否具有与 Web API 中相同的覆盖可能性。

标签: serialization asp.net-web-api json.net


【解决方案1】:

当您使用 JsonSerializer 并返回结果字符串时,它将被序列化为 Json再次。您必须绕过 HttpRequest.CreateResponse() 扩展方法,并手动创建响应 - 这样,您可以自己设置内容和内容类型。一个有用的起点是查看source code for CreateResponse(在第 332 行附近)。不要使用ObjectContent<T>,而是使用StringContent,媒体类型为“application/json”。

【讨论】:

  • 感谢 Andrew,这听起来很合理。我的一天结束了,所以我稍后再试,如果我得到我需要的东西,我会标记为已回答。
  • 不试一试就无法放松。解决方案是: var response = new HttpResponse(HttpStatusCode.OK); response.Content = new StringContent();返回响应;谢谢指点。
  • 请注意,您可能希望将媒体类型明确设置为“应用程序/json” - 我很确定 StringContent 会默认为“应用程序/文本”。例如,当您使用 jQuery 使用输出时,这将有所帮助,因为它会自动解析 json 并返回一个对象,而不是一个字符串。
  • 嘿 Andrew,text/json 和 application/json 有区别吗?我从未见过它被引用为 application/json
  • W3 联盟确实将 application/json 列为 json 数据的官方 MIME 类型。除此之外,没有真正的区别 - 几乎每个消费应用程序都会接受其中一个。
猜你喜欢
  • 2012-05-18
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多