我的问题是:
这是从我的WebAPI控制器发回的响应。
"[
[
{"id":"identifier"},
{"name":"foobar"}
]
]"
请注意,响应被封装在引号中,并且所有嵌入的引号都被转义。这显然是个问题。我可以为JSON.NET序列化程序提供任何设置来防止这种情况发生吗?
编辑
正如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());
很简单。
您可能有这样的东西:
public string GetFoobars()
{
var foobars = ...
return JsonConvert.SerializeObject(foobars);
}
在这种情况下,您使用Json.NET将对象序列化为字符串,然后通过将结果作为字符串返回,API控制器将字符串序列化为JavaScript字符串文字—这将导致字符串被双引号包裹,并导致字符串中的任何其他特殊字符用反斜杠转义。
解决方案是简单地自行返回对象:
public IEnumerable<Foobar> GetFoobars()
{
var foobars = ...
return foobars;
}
这将导致API控制器使用其默认设置序列化对象,这意味着它将根据从客户端传入的参数将结果序列化为XML或JSON。
进一步阅读
- ASP.NET Web API中的JSON和XML序列化
API在发送响应之前进行序列化。示例:return Ok(yourUnSerializedObject);
没必要为你说教。
检查属性修饰符。例如:
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; }