2017-03-08 30 views
1

如果我有一个简单的类:Newtonsoft系列化VS ASP.NET系列化

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

,我把它传递给HttpRequest.CreateResponse()的输出是:

{ "id": "1234bcf6678" } 

不过,如果我使用一个JsonSerializer我得到:

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

据我所知,第二个实际上是一个JSON字符串,但我怎么能使用日e JsonSerializer AND将结果从它传递给HttpRequest.CreateResponse(),以获得第一个输出(即,没有逃脱的引号)?

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

对于额外的背景下它可能是值得了解的,我做这里面Azure的功能。我看到Web API有System.Web.Http.GlobalConfiguration可用但功能不确定。

+0

ASP.Net使用Json.net内部,你可以在应用程序的启动配置。你能更具体地说明你的情况吗,ASP.Net没有返回正确的输出结果? –

+0

我刚刚做了一个编辑。这是在Azure函数内部,所以我不确定我是否通过GlobalConfiguration具有与在Web API中相同的覆盖可能性。 – user1200984

回答

1

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

+0

谢谢Andrew,这听起来很合理。这是我一天的结束,所以我会稍后再尝试,如果我得到了我所需要的东西,请将其标记为已回答。 – user1200984

+0

不放松就不放手。解决方案是: var response = new HttpResponse(HttpStatusCode.OK); response.Content = new StringContent(的输出); 返回响应; 感谢您的指针。 – user1200984

+0

只是一个人,你可能想明确地设置媒体类型为'application/json' - 我非常确定StringContent deafults为'application/text'。这将有助于,例如,当您使用jQuery使用输出时,它将自动解析json并返回一个对象,而不是一个字符串。 –