使用 SnakeYaml 处理缺失的字段

Posted

技术标签:

【中文标题】使用 SnakeYaml 处理缺失的字段【英文标题】:Processing missing fields using SnakeYaml 【发布时间】:2017-09-29 20:39:14 【问题描述】:

假设我有一个简单的类,它包含两个字段,getter 和 setter。我有时想序列化和反序列化这个类的对象。

public class Foo 
    private String a;
    private int b;

    public void setA(String a) 
        System.out.println("a setter called");
        this.a = Objects.requireNonNull(a, "Required non null field.");
    

    public void setB(int b) 
        System.out.println("b setter called");
        this.b = b;
    

    public String getA() 
        return a;
    

    public int getB() 
        return b;
    

    public static void main(String[] args) 
        Representer representer = new Representer();
        representer.getPropertyUtils().setSkipMissingProperties(false);
        Yaml yaml = new Yaml(new Constructor(), representer);
        String doc = "b: 10";
        Foo testBean = yaml.loadAs(doc, Foo.class);
    

我希望 main 方法中的代码抛出一些异常,因为 doc 中缺少字段 a。不幸的是,默认情况下它不起作用。

我可以以某种方式配置 SnakeYaml 来做到这一点吗?

【问题讨论】:

我也想知道 SnakeYaml 是否可以自己做到这一点......从目前唯一的答案来看,没有另一个库是不可能的。 【参考方案1】:

使用构建器模式可能是最好的方法。将这一切放在一起,最终使用 Jackson(不确定它是否/是否可以单独使用 SnakeYaml)和构建器的 Immutables (https://immutables.github.io/) 更容易。

请注意,您可以自己编写构建器,也可以在构建器的 build() 方法中进行验证,但 Immutables 使这一切变得更容易。

首先,你的模型类:

@Value.Immutable
@JsonDeserialize(builder = ImmutableFoo.Builder.class)
public interface Foo 
    String getA();
    int getB();

请注意,默认情况下getA() 不能返回 null(如果您想更改该行为,可以使用 @Nullable 对其进行注释或将其设为 Optional<String>)。运行注释处理器后,您将拥有一个 ImmutableFoo 类,其中包含具有所需语义的构建器。

然后将您的反序列化切换为使用 Jackson(显然在后台使用 SnakeYaml,因此应该不会有太大的不同):

new ObjectMapper(new YAMLFactory()).readValue("b: 10", Foo.class);

这将抛出一个JsonMappingException,其原因在于构建器:

java.lang.IllegalStateException: 无法构建 Foo,一些必需的属性未设置 [a]

如果您想避免使用 Immutables,您可以在自己的构建器中进行此类验证。

【讨论】:

晚了几年,但这帮助了我。感谢您非常清晰和周到的解释!

以上是关于使用 SnakeYaml 处理缺失的字段的主要内容,如果未能解决你的问题,请参考以下文章

snakeyaml自定义pojo写入yml文件时属性字段排序问题

R语言vtreat包自动处理dataframe的缺失值并生成对应的数据列_isbad来指示数据的原始缺失情况查看特定字段缺失的那些数据行查看数据集中多个字段的均值

scala -- 处理嵌套的 json 和缺失的字段

python使用箱图法和业务规则进行异常数据处理并检查预测使用的数据特征是否有字段缺失的情况并补齐

pandas数据预处理(字段筛选query函数进行数据筛选缺失值删除)seaborn使用Catplot函数可视化基本箱图(Boxplot with Seaborn Catplot)

pandas数据预处理(字段筛选query函数进行数据筛选缺失值删除)seaborn可视化分面图(facet)seaborn使用Catplot可视化分面箱图(Faceted Boxplot)