将 Json 反序列化为 NJson 架构生成的对象,枚举包含空格

Deserialization of Json to NJsonSchema generated object with enums containing spaces

需要你的帮助。

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

这就是我所说的

在模式中我有一个 属性 像:

...
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,
    }

这里有两个输入示例: Json1:

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

Json 2:

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

然后我在需要的时候反序列化它:

var someModel = Some.FromJson(json);

它按照 Json 2 应有的方式工作,但它无法识别 space 的枚举值,并出现如下错误:

"Error converting value \"with space\" to type 'com.company.model.Some_prop1'. Path 'prop1', line 7, position 24."

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

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

此致,康斯坦辛。

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

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

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

因此在生成的 class 中将使用 StringEnumConverter 属性,serialization\deserialization 将按照我想要的方式进行。