.NET中如何自定义JSON枚举的反序列化?我有以下示例C#代码,使用svcutils.exe应用程序从xsd自动生成。[DataContract]publicenumFoo{[EnumMember(Value="bar")]Bar=1,[EnumMember(Value="baz")]Baz=2}[DataContract]公共类UNameIt{[DataMember(Name="id")]publiclongId{get;私有集;}[DataMember(Name="name")]publicstringName{get;私有集;}[DataMember(Name="foo")]publicFooFoo{get;私有集;以下是一个单元测试,它尝试将示例JSON文档反序列化为UNameIt类。[TestClass]publicclassJsonSerializer_Fixture{publicconststringJsonData=@"{""id"":123456,""name"":""JohnDoe",""foo"":""Bar""}";[测试方法]publicvoidDataObjectSimpleParseTest(){DataContractJsonSerializerserializer=newDataContractJsonSerializer(typeof(UNameIt));MemoryStreamms=newMemoryStream(Encoding.Unicode.GetBytes(JsonData));UNameItdataObject=serializer.ReadObject(ms)asUNamet.IsNotNull(dataObject);Assert.AreEqual(123456,dataObject.Id);Assert.AreEqual(Foo.Baz,dataObject.Foo);不幸的是,测试失败,原因如下:System.Runtime.Serialization.SerializationException:AnerroroccurredwhiledeserializinganobjectoftypeMyNamespace.Units.UNameIt.“Bar”值无法解析为类型“Int64”。如果我更新我的JSON字符串以用整数替换枚举的字符串说明符,则测试通过,例如publicconststringJsonData=@"{""id"":123456,""name"":""JohnDoe"",""foo"":""1""}";我没有更改提供的JSON的灵活性,因此我必须弄清楚在序列化时如何转换字符串Enum表示。理想情况下,我想在不必更改自动生成的类的情况下帮助解决这个问题,因为一旦我重新生成类,我就会丢失更改。我想知道是否可以将DataContractJsonSerializer扩展到自定义句柄枚举?或者也许有更好的方法来做到这一点?此行为是设计使然。这里引用MSDN上的Enumerations和JSON段落:EnumerationmembervaluesaretreatedasnumbersinJSON,不像它们在数据契约中的处理方式,它们被作为成员名称包含在内。此外,DataContractJsonSerializer将自动序列化所有枚举,因此实际上忽略了EnumMemberAttribute。有关解决方法,请在SO上查看此答案。这是有效的:varret=newJavaScriptSerializer().Deserialize(retApi.Item2);但是不能使用datamembers属性,所以不能重命名属性。您必须设置Json发送的属性名称。以上就是C#学习教程:.NET中如何自定义JSON枚举的反序列化?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
