我在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类,我无法覆盖,所以如何删除下划线以便在客户端上正确反序列化?
答案 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)
很抱歉,我无法帮助您解决此问题。在不同的情况下,我有类似的东西。 我只能建议你使用
我希望它会有所帮助。
答案 4 :(得分:0)
如果您想快速解决方法,请参阅
public object Get()
{
var version = new System.Version(1, 2, 3, 4);
return new
{
version.Build,
version.Major,
version.Minor,
version.Revision
};
}