无法从 START_OBJECT 令牌中反序列化 MyEnum 实例

Vik*_* V. 2 jackson spring-webflux

遇到了从 JSON 到 POJO 的 MyEnum 枚举反序列化问题,无法弄清楚我做错了什么。所以基本上我尝试检索一些调用特定微服务端点的数据,该端点返回以下 json:

    {
      "id": "9cabf3e9-965d-4407-b62b-c57dd6006419",
      "myEnums": [
        {
          "context": "SOME_FOO_CONTEXT_1",
          "feature": "SOME_BAR_FEATURE_1",
          "name": "SOME_FOO_BAR_1"
        },
        {
          "context": "SOME_FOO_CONTEXT_2",
          "feature": "SOME_BAR_FEATURE_2",
          "name": "SOME_FOO_BAR_2"
        }
      ],
      "name": "Some name",
      "updatedBy": null,
      "updated": "2019-05-16T00:11:19.279Z"
    }
Run Code Online (Sandbox Code Playgroud)

这是调用另一个微服务端点、将响应正文反序列化为 POJO 并将结果作为 Set 返回的方法:

      private Mono<Set<MyEnum>> fetchMyEnums(UUID someId) {
            return webClient.get().uri("/v1/something/{id}", someId)
                            .retrieve()
                            .bodyToMono(MyClass.class)
                            .flatMapIterable(MyClass::getMyEnums)
                            .collect(toSet());
        }
Run Code Online (Sandbox Code Playgroud)

用于JSON反序列化的类:

    @lombok.Value
    static class MyClass {

        List<MyEnum> myEnums;

    }
Run Code Online (Sandbox Code Playgroud)

我实际上无法反序列化的枚举:

    @Getter
    @RequiredArgsConstructor
    @AllArgsConstructor
    @JsonFormat(shape = JsonFormat.Shape.OBJECT)
    public enum MyEnum {

        SOME_FOO_BAR_1(SOME_FOO_CONTEXT_1, SOME_BAR_FEATURE_1),
        SOME_FOO_BAR_2(SOME_FOO_CONTEXT_2, SOME_BAR_FEATURE_2);

        private final FooEnum context;
        private final BarEnum feature;
        private       String  name;

        @JsonProperty
        public String getName() {
            return super.name();
        }

    }
Run Code Online (Sandbox Code Playgroud)

在反序列化过程中,我收到以下异常:

    org.springframework.core.codec.DecodingException: JSON decoding error: Cannot deserialize instance of `com.learn.common.security.model.MyEnum` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.learn.common.security.model.MyEnum` out of START_OBJECT token
     at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: com.learn.common.security.service.MyEnumService$MyClass["myEnums"]->java.util.ArrayList[0])
Run Code Online (Sandbox Code Playgroud)

我哪里做错了?

Vik*_* V. 6

因此,花了几个小时来澄清反序列化的问题是什么,我发现 Enum 的 Shape.Object 没有自动反序列化。

但我找到了如何从 json 反序列化 MyEnum 对象的解决方法(您需要定义将其标记为 JsonCreator 的静态方法,并定义您希望从使用 fieldName 定义 JsonProperty 的对象中捕获的输入参数):

@Getter
@RequiredArgsConstructor
@AllArgsConstructor
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum MyEnum {

    SOME_FOO_BAR_1(SOME_FOO_CONTEXT_1, SOME_BAR_FEATURE_1),
    SOME_FOO_BAR_2(SOME_FOO_CONTEXT_2, SOME_BAR_FEATURE_2);

    private final FooEnum context;
    private final BarEnum feature;
    private       String  name;

    @JsonProperty
    public String getName() {
        return super.name();
    }

    @JsonCreator
    public static MyEnum fromJson(@JsonProperty("name") String name) {
        return valueOf(name);
    }

}
Run Code Online (Sandbox Code Playgroud)