gpt4 book ai didi

c# - 如何在 .NET 中自定义 JSON 枚举的反序列化?

转载 作者:太空狗 更新时间:2023-10-29 19:39:45 29 4
gpt4 key购买 nike

我有以下示例 C# 代码,它是使用 svcutils.exe 应用程序从 xsd 自动生成的。

    [DataContract]
public enum Foo
{
[EnumMember(Value = "bar")]
Bar = 1,

[EnumMember(Value = "baz")]
Baz = 2
}

[DataContract]
public class UNameIt
{
[DataMember(Name = "id")]
public long Id { get; private set; }

[DataMember(Name = "name")]
public string Name { get; private set; }

[DataMember(Name = "foo")]
public Foo Foo { get; private set; }
}

以下是一个单元测试,它尝试将示例 JSON 文档反序列化为 UNameIt 类。

    [TestClass]
public class JsonSerializer_Fixture
{
public const string JsonData = @"{ ""id"":123456,
""name"":""John Doe"",
""foo"":""Bar""}";

[TestMethod]
public void DataObjectSimpleParseTest()
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(UNameIt));

MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(JsonData));
UNameIt dataObject = serializer.ReadObject(ms) as UNameIt;

Assert.IsNotNull(dataObject);
Assert.AreEqual(123456, dataObject.Id);
Assert.AreEqual(Foo.Baz, dataObject.Foo);
}
}

很遗憾,测试失败,原因如下:

System.Runtime.Serialization.SerializationException: There was an error deserializing the object of type MyNamespace.Units.UNameIt. The value 'Bar' cannot be parsed as the type 'Int64'.

如果我更新我的 JSON 字符串以将 Enum 的字符串说明符替换为整数,例如,测试将通过

public const string JsonData = @"{ ""id"":123456,
""name"":""John Doe"",
""foo"":""1""}";

我没有更改提供的 JSON 的灵 active ,所以我必须弄清楚如何在序列化时转换字符串枚举表示。理想情况下,我想在不必更改自动生成类的情况下促进这一点,因为一旦我重新生成类,我就会失去我的更改。

我想知道是否可以将 DataContractJsonSerializer 扩展为自定义句柄枚举?或者也许有更好的方法来做到这一点?

最佳答案

此行为是设计的。这是来自 Enumerations and JSON paragraph on MSDN 的引述:

Enumeration member values are treated as numbers in JSON, which is different from how they are treated in data contracts, where they are included as member names.

此外 DataContractJsonSerializer将自动序列化所有枚举,因此 EnumMemberAttribute实际上被忽略了。

有关解决方法,请查看 this answer on SO .

关于c# - 如何在 .NET 中自定义 JSON 枚举的反序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8999731/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com