一尘不染

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

c#

我的问题是这样的:

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

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

注意,响应用引号引起来,所有嵌入的引号均被转义。这显然是一个问题。我可以为JSON.NET序列化器提供任何设置来防止这种情况发生吗?

编辑

正如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());

十分简单。


阅读 225

收藏
2020-05-19

共1个答案

一尘不染

您可能有这样的事情:

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

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

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

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

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

进一步阅读

2020-05-19