【问题标题】:Parsing yaml using jackson databind causes MismatchedInputException使用杰克逊数据绑定解析 yaml 导致 MismatchedInputException
【发布时间】:2018-11-20 04:56:57
【问题描述】:

我尝试读取的yaml格式如下

- name: storage
  scm: git
  src: git+https://bitbucket.org/cer/linux_storage_jenkins.git
  version: '5'
- name: linux_jenkins
  scm: git
  src: git+https://bitbucket.org/cer/linux_jenkins.git
  version: '8'

我的模型很简单

public class Requirementsyml {
    //setter and getter in place
    private List<Requirement> items;
}

public class Requirement {
    private String name;
    private String scm;
    private String src;
    private String version;
}

我正在尝试读取 yaml 内容如下:

ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
Requirementsyml req = mapper.readValue(yaml_file_content, Requirementsyml.class);

但是我得到以下异常 com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of Requirementsyml out of START_ARRAY token

由于模型有一个列表,我认为输入不应该不匹配。 我尝试将 yaml 文件提供为 java 文件对象,而不是将其内容作为字符串提供。结果保持不变。我错过了什么?

【问题讨论】:

    标签: java jackson yaml fasterxml


    【解决方案1】:

    yaml 结构应该有itemsarray/list

    items:
    - name: storage
      scm: git
      src: git+https://bitbucket.org/cer/linux_storage_jenkins.git
      version: '5'
    - name: linux_jenkins
      scm: git
      src: git+https://bitbucket.org/cer/linux_jenkins.git
      version: '8'
    

    否则您可以将其读取为需求列表,而无需更改 yaml

    @Test
    void test() throws IOException {
        ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
        List<Requirement> requirements = mapper.readValue(new File("src/test/resources/requirements.yml"), new TypeReference<List<Requirement>>() {});
        assertEquals(2, requirements.size());
    }
    

    还要确保 Requirement 和其他类没有 args 构造函数,否则在 ObjectMapper 上设置适当的标志

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 2015-02-28
      • 2019-11-25
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 2020-10-16
      相关资源
      最近更新 更多