首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法通过Jackson Yaml反序列化对象数组

无法通过Jackson Yaml反序列化对象数组
EN

Stack Overflow用户
提问于 2021-10-18 15:23:06
回答 1查看 365关注 0票数 0

我试图反序列化一个YAML配置文件,它将一个特定的操作(enum)映射到参数(String[])。为了为YAML提供一个起点,我首先用Java构建了对象结构,然后对其进行序列化。

读取输出并反序列化它也会导致下面的异常,这是意外的,因为这是直接从马嘴里出来的。

我的Java结构:

代码语言:javascript
复制
@NoArgsConstructor
@AllArgsConstructor
@ToString(doNotUseGetters = true)
@Data
public class Session {
  @EqualsAndHashCode.Exclude protected List<ActionInstance> actions;
}

@NoArgsConstructor
@AllArgsConstructor
@ToString(doNotUseGetters = true)
@Data
public class ActionInstance {
  protected Action action;
  protected String[] arguments;
}

public enum Action {
  Left,
  Right,
  Up,
  Down;
}

YAML (直接取自Jackson的序列化输出,将其读取回引起下面的异常):

代码语言:javascript
复制
actions: !<java.util.ImmutableCollections$List12>
- !<java.util.ImmutableCollections$List12>
  arguments:
  - 90.00
  action: Left

杰克逊服务反序列化:

代码语言:javascript
复制
objectMapper.readValue(inputStream, Session.class)

例外:

代码语言:javascript
复制
com.fasterxml.jackson.databind.exc.MismatchedInputException
Unexpected token (VALUE_STRING), expected START_ARRAY: need JSON Array to contain As.WRAPPER_ARRAY type information for class Action

编辑#1:

代码语言:javascript
复制
final Session export = new Session();
        export.setActions(
            List.of(
                new ActionInstance(Action.Left, new String[] {"90.00"})));
        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
        serializationService.serialize(export, baos);

杰克逊的实现大致是这样的:

代码语言:javascript
复制
outputStream.write(objectMapper.writeValueAsBytes(data));

ObjectMapperProvider:

代码语言:javascript
复制
public class ObjectMapperProvider implements Provider<ObjectMapper> {
  protected final ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
  protected final JavaTimeModule javaTimeModule = new JavaTimeModule();

  @Inject
  public ObjectMapperProvider() {
    // Hack time module to allow 'Z' at the end of string (i.e. javascript json's)
    javaTimeModule.addDeserializer(
        LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ISO_DATE_TIME));
    objectMapper.registerModule(javaTimeModule);
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

    objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator());
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-29 18:34:37

解决办法很简单:

行动:!

  • 参数:
    • 90.00动作:!
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69618623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档