【问题标题】:Reading YAML with Jackson ignores keys without values用 Jackson 读取 YAML 会忽略没有值的键
【发布时间】:2018-11-24 22:47:36
【问题描述】:

我有以下 YAML 文件:

---
-
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<>();
    }
}

不幸的是,这会返回一个只有idstartresult 的地图,因此忽略其他两个。

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

【问题讨论】:

    标签: java jackson yaml


    【解决方案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

    【讨论】:

    • 实际上,yaml文件的格式似乎没有问题。但是我发现了我的错误,这是代码的另一部分的错误检查,所以你对默认行为是绝对正确的
    【解决方案2】:

    你应该用你想要的所有可能的属性创建你自己的对象(新类),例如:

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

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

    List<MyCompleteInfo >
    

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

    documentation

    【讨论】:

    • 我事先不知道构建类的属性
    • 您可能在某处使用过@JsonInclude(Include.NON_EMPTY)?你不应该。
    • 在 Stackoverflow 上,您可以将up-vote 提供给人们有用的答案以感谢他们,并从所有答案中选择correct answer 中的任何一个。
    猜你喜欢
    • 2020-06-17
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多