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

时间:2014-08-28 22:46:53

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

我的问题是:

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

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

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

修改

正如p.s.w.g在回答中猜到的那样,我正在使用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());

轻松自负。

3 个答案:

答案 0 :(得分:8)

你可能有这样的事情:

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

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

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

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

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

进一步阅读

答案 1 :(得分:0)

API在发送共振之前进行序列化。 示例:返回Ok(yourUnSerializedObject);

无需为您服务。

答案 2 :(得分:0)

检查属性修改器。例如:

  public List<Yourobjectclass> columnaLista { get; set; }

    public List<Yourobjectclass> ColumnaLista
    {
        get
        {
            return this.columnaLista;
        }
        set
        {
            this.columnaLista = value;
        }

序列化程序将不加名称地添加columnaLista的所有对象,因为您有两个带有public修饰符的属性。

要解决此问题,必须像下面这样更改属性修饰符:

      private List<Yourobjectclass> columnaLista { get; set; }