ASP.NET的Web API与下划线序列化(ASP.NET Web API is serializ

2019-10-19 08:40发布

我在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>

请注意,属性的前面有一个_ 。 综观的类定义Version所有这些属性Getters而已,我怀疑有事情做与为什么序列化添加_ 。 我也试图找到信息在这里为什么发生这种情况,但所有它说, Read-only properties are serialized by default.

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

这是一个CLR类,我不能重写,所以我怎么能删除下划线所以它正确地反序列化在客户端上?

Answer 1:

默认情况下的Web API序列化的有一个[Serializable]属性(例如版)类型的字段。 我不是它的一个巨大的风扇这就是为什么Json.NET默认不这样做,但是这是在Web API人想要的东西。

这将停止网络API的JSON这样做:

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


Answer 2:

在不改变整个串行器,你可以返回一个映射与CLR版本类的自定义对象。

版本号不应该过于频繁改变。 我建议把它的注释,使您的未来的自己不重构它走。

如果您正在使用的DataContractSerializer,试试这个:

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

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

我曾与JSON.NET测试,它似乎皮卡是被命名为喜欢你的输出,并完全避免了公共属性的字段。

作为一个临时的解决方案,我会复制对象,所以返回它更好地控制序列化。



Answer 3:

最新JSON.NET和MVC二进制文件赋予了相同的结果。 如果你设置了一个控制台应用程序,并使用JSON.NET序列化,你得到预期的(无下划线)版本。 您可以尝试使用的媒体类型格式化和串行坐立不安有关,但说实话,我只是创建一个值对象来包装版本,并用它做。

我也试图与只读属性创建值对象,并现场没有制定者的支持性能。 这一切都没有连载下划线。 一定有什么东西在版本类本身。



Answer 4:

对不起,我不能帮你这个问题。 我曾在不同的情况下,类似的东西。 我可以推荐你是使用

  1. 与string.replace( '_',的String.Empty());
  2. 反序列化。

我希望这将有助于。



Answer 5:

如果你想快速的解决方法,这里是一个

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


文章来源: ASP.NET Web API is serializing with underscore