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



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

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

这导致以下结果:

杰森

{"_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 类,我无法重写它,那么如何删除下划线以便它在客户端上正确反序列化?

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

这将停止 Web API 在 JSON 中执行此操作:

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

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

版本号不应经常更改。我建议对它发表评论,这样你未来的自己就不会重构它。

如果您使用的是 DataContractSerializer,请尝试以下操作:

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

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

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

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

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

我还尝试创建一个具有只读属性的值对象,以及没有 setter 的字段支持属性。这一切都是在没有下划线的情况下序列化的。必须是 Version 类本身中的某些内容。

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

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

抱歉,我无法帮助您解决此问题。在不同的案例中,我也有类似的东西。我只能命令你

使用
  1. String.Replace('_',string.空());
  2. 反序列化它。

我希望它会有所帮助。

相关内容

  • 没有找到相关文章

最新更新