C# JSON.NET解析器*似乎在双重序列化我的对象

C# JSON.NET解析器*似乎在双重序列化我的对象,c#,serialization,asp.net-web-api,json.net,C#,Serialization,Asp.net Web Api,Json.net,我的问题是: 这是从我的WebAPI控制器发回的响应 "[ [ {\"id\":\"identifier\"}, {\"name\":\"foobar\"} ] ]" 请注意,响应被包装在引号中,所有嵌入的引号都被转义。这显然是个问题。我是否可以为JSON.NET序列化程序提供任何设置来防止这种情况发生 编辑 正如p.s.w.g在他的回答中猜测的那样,我使用的是JSON.NET JsonConvert.SerializeObject(instance) 执

我的问题是:

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

"[
   [
      {\"id\":\"identifier\"},
      {\"name\":\"foobar\"}
   ]
]"
请注意,响应被包装在引号中,所有嵌入的引号都被转义。这显然是个问题。我是否可以为JSON.NET序列化程序提供任何设置来防止这种情况发生

编辑 正如p.s.w.g在他的回答中猜测的那样,我使用的是JSON.NET

JsonConvert.SerializeObject(instance)
执行我的序列化

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

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

将HttpGets的返回类型从string更改为“my object type”,并将这些转换器直接插入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);
}
      private List<Yourobjectclass> columnaLista { get; set; }
在本例中,您将使用Json.NET将对象序列化为字符串,然后通过将结果返回为字符串,API控制器将字符串序列化为JavaScript字符串文字,这将导致字符串用双引号括起来,并导致字符串中的任何其他特殊字符用反斜杠转义

解决方案是只返回对象本身:

public IEnumerable<Foobar> GetFoobars()
{
    var foobars = ...
    return foobars;
}
public IEnumerable GetFoobars()
{
var foobars=。。。
返回foobars;
}
这将导致API控制器使用其默认设置序列化对象,这意味着它将根据从客户端传入的参数将结果序列化为XML或JSON

进一步阅读


    • API在发送响应之前序列化。 示例:返回Ok(yourUnSerializedObject)


      无需为您进行序列化。

      检查您的属性修改器。举例来说:

        public List<Yourobjectclass> columnaLista { get; set; }
      
          public List<Yourobjectclass> ColumnaLista
          {
              get
              {
                  return this.columnaLista;
              }
              set
              {
                  this.columnaLista = value;
              }
      
      public List columnaLista{get;set;}
      公共列表专栏作家
      {
      得到
      {
      返回这个。columnaLista;
      }
      设置
      {
      this.columnaLista=值;
      }
      
      序列化程序将添加columnaLista的所有对象,而不重新命名,因为您有两个带有public修饰符的属性

      若要修复此问题,必须更改属性修改器,如下所示:

      public string GetFoobars()
      {
          var foobars = ...
          return JsonConvert.SerializeObject(foobars);
      }
      
            private List<Yourobjectclass> columnaLista { get; set; }
      
      private List columnaLista{get;set;}
      
      你能展示API操作吗?你的最上面的代码片段正是我正在做的。我正在对我的对象调用JsonConvert.SerializeObject。(我不在我的开发机器上,或者我会直接测试这个)在WebAPI将对象放入响应之前,返回的对象是否会通过JSON.NET转换器?@K.AlanBates是的,如果您参考链接的文档,您将看到这将使用
      JsonMediaTypeFormatter
      ,它在默认情况下反过来使用JSON.NET。在这一点上,我想我必须提到这一点使用我自己的JSONConverter完成此任务。我从初始描述中删除了它们,因为我不想提供无关的信息。我需要能够调用JsonConvert.SerializeObject(或使用我的转换器的等效方法)并让它返回json而不是字符串。返回对象只不过是序列化对象的ToString(),我不能这样做。如果您使用
      [JsonConverter]注释类,我也没有数据契约可以使用。@K.AlanBates
      属性不应该是问题。如果您不控制这些类并且无法添加任何属性,可以直接在
      WebApiConfig.cs
      文件(或类似文件)中调整全局在过去的几分钟里,我一直在尝试远程访问我的dev box以查看我的WebApiConfig设置,因为我可以发誓我已经配置了我的JsonMediaTypeFormatter。我还将自定义转换器添加到SerializerSettings中,并调用JsonConvert.SerializeObject(实例)调用我的转换器,但返回字符串转义的JSON。我在连接时遇到问题,因此我必须将其保留到明天早上,直到我可以确认我的当前配置。感谢您迄今为止的帮助。此问题已在6年前解决。核心问题是自定义转换器尚未合并到SerializerSetting中HttpConfiguration中JsonFormatter的。
      config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new CustomConverter());
      更正了该问题。(在我接受答案后,在问题的编辑部分详细介绍了这一点)