JSON.NET Parser *似乎*是双重序列化我的对象

我的问题是:

这是从我的WebAPI控制器发回的响应。

"[ [ {\"id\":\"identifier\"}, {\"name\":\"foobar\"} ] ]" 

请注意,响应包含在引号中,并且所有嵌入的引用都被转义。 这显然是个问题。 我可以为JSON.NET Serializer提供任何设置以防止这种情况发生吗?

编辑

正如pswg在他的回答中猜到的那样,我正在使用JSON.NET

 JsonConvert.SerializeObject(instance) 

执行我的序列化。

我这样做是因为当我构建我的自定义转换器时,我将它们包含在我的WepApiConfig中的JsonConvert.DefaultSettings中(我显然认为这不是问题)

我之前尝试将我的HttpGets的返回类型交换为“我的对象类型”,响应是我对象的ToString()方法的json表示…这让我知道序列化没有通过我的转换器。

将我的HttpGets的返回类型从字符串更改为“我的对象类型”并将这些转换器直接插入到WebAPi的默认HttpConfiguration中就可以了。

 config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new FooConverter()); config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new BarConverter()); 

十分简单。

你可能有这样的事情:

 public string GetFoobars() { var foobars = ... return JsonConvert.SerializeObject(foobars); } 

在这种情况下,您使用Json.NET将对象序列化为字符串,然后通过将结果作为字符串返回,API控制器将字符串序列化为JavaScript字符串文字 – 这将导致字符串用双引号括起来并使字符串中的任何其他特殊字符使用反斜杠进行转义。

解决方案是简单地返回对象:

 public IEnumerable GetFoobars() { var foobars = ... return foobars; } 

这将导致API控制器使用其默认设置序列化对象,这意味着它将根据从客户端传入的参数将结果序列化为XML或JSON。

进一步阅读

  • ASP.NET Web API中的JSON和XML序列化