java - 如何在Java中使用snake yaml序列化具有自定义名称的字段

标签 java serialization yaml pojo snakeyaml

我正在尝试序列化具有如下字段的 Java 实例。

public class Person{
    private String firstName;
    private String lastName;

    public String getFirstName() {

        return firstName;
    }

    public void setFirstName(String firstName) {

        this.firstName = firstName;
    }

    public String getLastName() {

        return lastName;
    }

    public void setLastName(String lastName) {

        this.lastName = lastName;
    }
}

如何使用与实际字段名称不同的名称来序列化它们?在 Gson 中,可以通过使用 @SerializedName("first-name") 注释来实现,如下所示。

@SerializedName("first-name")
private String firstName;

snakeyaml 中是否有类似上面的内容。 snakeyaml 的依赖项详细信息如下,

        <dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
            <version>1.17</version>
        </dependency>

下面是程序的主类以及flyx提供的答案

public class Demo {

    public static void main(String[] args) {

        Person person = new Person();
        person.setFirstName("Kasun");
        person.setLastName("Siyambalapitiya");

        Constructor constructor = new Constructor(Person.class);
        Representer representer = new Representer();
        TypeDescription personDesc = new TypeDescription(Person.class);
        personDesc.substituteProperty("first-name", Person.class, "getFirstName", "setFirstName");
        personDesc.substituteProperty("last-name", Person.class, "getLastName", "setLastName");
        constructor.addTypeDescription(personDesc);
        representer.addTypeDescription(personDesc);
        Yaml yaml = new Yaml(constructor, representer);
        String yamlString = yaml.dumpAs(person, Tag.MAP, DumperOptions.FlowStyle.BLOCK);

        Path updateDescriptorFilePath =
                Paths.get(File.separator + "tmp" + File.separator + "sample.json");
        try {
            FileUtils.writeStringToFile(updateDescriptorFilePath.toFile(), yamlString);
        } catch (IOException e) {
            System.out.println(e.getCause());
        }
    }
}

以上结果产生以下输出

/tmp  cat sample.json
first-name: Kasun
last-name: Siyambalapitiya
firstName: Kasun
lastName: Siyambalapitiya
 /tmp   

最佳答案

Constructor constructor = new Constructor(Person.class);
Representer representer = new Representer();
TypeDescription personDesc = new TypeDescription(Person.class);
personDesc.substituteProperty("first-name", String.class,
        "getFirstName", "setFirstName");
constructor.addTypeDescription(personDesc);
representer.addTypeDescription(personDesc);
Yaml yaml = new Yaml(constructor, representer);
// and then load /dump your file with it

关于java - 如何在Java中使用snake yaml序列化具有自定义名称的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54351787/

相关文章:

python - 将字典转储到 YAML 文件,同时保留顺序

java - @ConditionalOnProperty 用于多值属性

ansible - ansible 2.7.10 - "ERROR! playbook entries must be either a valid play or an include statement|"中出现此错误的原因是什么

java - 使用客户模型的 Gson 反序列化

c++ - CTreeCtrl 保存运行时添加的项目

json - 什么是标记语言? (XML、YAML、JSON)

c# - 反序列化的ServiceStack时间

java - 从tomcat访问本地资源

java - org.springframework.ws.client.WebServiceTransportException : [ISS. 0084.9001]凭据无效[401]

java - eclipse.ui.menus 的名称过滤器