用Jackson读取YAML会忽略没有值的键

时间:2018-11-24 22:47:37

标签: java jackson yaml

我有以下YAML文件:

(?<=redd\.it\/)(\w+)

https://redd.it/willmatchthis/butnotthis

我想和杰克逊一起读一个简单的--- - id: 001 start: 21.11.2018 additional: dependency: result: 2

为此,我使用以下代码

List<Map<String, Object>>

不幸的是,这会返回仅包含 private List<Map<String, Object>> readDefaultInputAsMap() { var objectMapper = new ObjectMapper(new YAMLFactory()); objectMapper.setDateFormat(new SimpleDateFormat("dd.MM.yyyy")); try { return objectMapper.readValue(inputResource, new TypeReference<List<Map<String, Object>>>() { }); } catch (IOException e) { e.printStackTrace(); return new ArrayList<>(); } } idstart的地图,因此其他两个都将被忽略。

我如何让Jackson解析文件并创建完整地图,例如result作为空键的值? (或其他任何默认值)?

2 个答案:

答案 0 :(得分:1)

您应该使用所需的所有可能属性创建自己的Object(新类),例如:

 class MyCompleteInfo {
    String id;
    String start;
    String additional;
    String dependency;
    String result;
 }

并使用它的列表(作为方法返回,并在您的阅读器中):

List<MyCompleteInfo >

编辑:您可能在某处使用了@JsonInclude(Include.NON_EMPTY)? 你一定不能。

请参见documentation

答案 1 :(得分:1)

实际上,默认情况下会这样做。仔细检查您的YML格式(因为您的示例似乎无效)。这是对我有用的东西:

test.yml

---
- id: 001
  start: 21.11.2018
  additional:
  dependency:
  result: 2

Test.java

public class App {
    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
        objectMapper.setDateFormat(new SimpleDateFormat("dd.MM.yyyy"));
        try {
            final Object value = objectMapper.readValue(App.class.getResource("test.yml"), new TypeReference<List<Map<String, Object>>>() {
            });

            System.out.println(value);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我得到了结果:

[{id=1, start=21.11.2018, additional=null, dependency=null, result=2}]

如您所见,additionaldependency都是null