ASP.NET Web API使用下划线进行序列化

时间:2014-02-12 21:11:54

标签: json serialization asp.net-web-api xml-serialization json.net

我在ApiController中有以下简单代码:

public Version Get()
{
  var version = new System.Version(1, 1, 0, 0);
  return version;
}

导致以下结果:

JSON

{"_Major":1,"_Minor":1,"_Build":0,"_Revision":0}

XML

<Version xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/System">
  <_Build>0</_Build>
  <_Major>1</_Major>
  <_Minor>1</_Minor>
  <_Revision>0</_Revision>
</Version>

请注意,属性前面有_。查看class definition of Version所有这些属性仅为Getters,我怀疑这与序列化添加_的原因有关。我还试图找到有关为何发生这种情况的信息here,但所有信息都说明Read-only properties are serialized by default.

问题是下划线搞乱了客户端的反序列化并导致版本0.0.0.0

这是一个CLR类,我无法覆盖,所以如何删除下划线以便在客户端上正确反序列化?

5 个答案:

答案 0 :(得分:6)

默认情况下,Web API序列化具有[Serializable]属性(例如Version)的类型的字段。我不是它的忠实粉丝,这就是为什么Json.NET默认不这样做,但这就是Web API人员想要的。

这将阻止Web API在JSON中执行它:

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.ContractResolver = new DefaultContractResolver();

答案 1 :(得分:1)

在不更改整个序列化程序的情况下,您可以返回使用CLR Version类映射的自定义对象。

版本号不应经常更改。我建议对它进行评论,以便你未来的自我不会重构它。

如果您使用的是DataContractSerializer,请尝试以下方法:

config.Formatters.XmlFormatter.SetSerializer(myType, new DataContractSerializer(myType, new DataContractSerializerSettings() { SerializeReadOnlyTypes = true });

否则,请确保JSON.NET是最新的。序列化只读属性应该没有任何困难。

我已经使用JSON.NET进行了测试,它似乎拾取了像输出一样命名的字段,并完全避免了公共属性。

作为临时解决方案,我会复制该对象并将其返回,以便更好地控制序列化。

答案 2 :(得分:1)

最新的JSON.NET和MVC二进制文件给出了相同的结果。如果您设置了一个控制台应用程序并使用JSON.NET进行序列化,那么您将获得预期的(无下划线)版本。您可以尝试使用媒体类型格式化程序和序列化程序,但说实话,我只是创建一个值对象来包装Version并完成它。

我还尝试创建一个只读属性的值对象,以及没有setter的字段支持的属性。它全部序列化没有下划线。必须是Version类本身的东西。

答案 3 :(得分:0)

很抱歉,我无法帮助您解决此问题。在不同的情况下,我有类似的东西。 我只能建议你使用

  1. 与string.replace( '_',的String.Empty());
  2. 反序列化。
  3. 我希望它会有所帮助。

答案 4 :(得分:0)

如果您想快速解决方法,请参阅

public object  Get()
    {
        var version = new System.Version(1, 2, 3, 4);
        return new
        {
            version.Build,
            version.Major,
            version.Minor,
            version.Revision
        };
    }