2

需要你的帮助。

所以,我有 json 模式,我使用了 NJsonSchema.CodeGeneration工具生成 .cs 模型。我能够使用它成功地将 json 反序列化为对象,直到输入 json 包含带有空格的枚举值。

这就是我所说的

在架构中,我有一个属性,例如:

...
prop1: {
                enum: [ 'with space', 'withoutspace' ],
            },
...

在生成的 .cs 模型中,我有一个相应的枚举:

[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "7.10.6235.25398")]
    public enum Some_prop1
    {
        [System.Runtime.Serialization.EnumMember(Value = "with space")]
        With_Space = 0,

        [System.Runtime.Serialization.EnumMember(Value = "withoutspace")]
        Withoutspace= 1,
    }

这里有两个输入示例:Json 1:

{
    ...
    "prop1": "with space",
    ...
} 

json 2:

{
    ...
    "prop1": "withoutspace",
    ...
} 

然后我只是在需要时反序列化它:

var someModel = Some.FromJson(json);

它以 Json 2 的方式工作,但它无法识别带有空格的枚举值,并出现如下错误:

“将值“带空格”转换为类型“com.company.model.Some_prop1”时出错。路径“prop1”,第 7 行,位置 24。”

所以这是我的主要问题:有没有办法在不改变模式中枚举格式的情况下处理这种情况?

额外的小问题:在调查时我又遇到了一个问题 - 如果我要使用 some.ToJson() 之类的序列化,我的枚举将以"prop1": 0 之类的方式生成,使用 int< 并且因为 json 被用作用户友好改变事物的方式,我需要像"prop1": "with space"这样的方式。

问候,康斯坦丁。

4

1 回答 1

2

我自己偶然找到了答案,希望它对其他人也有用。

问题是 enum 的默认值是 int,因此在反序列化时,它会尝试使用 enum 的 int 值或 enum 元素的确切名称。但是你可以强制它首先将枚举理解为字符串:

...
prop1: {
                type: "string",
                enum: [ 'with space', 'withoutspace' ],
            },
...

因此,在生成的类 StringEnumConverter 中将使用属性,并且序列化\反序列化将按照我想要的方式进行。

于 2017-02-13T12:38:21.507 回答