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

如何在Java中使用snake yaml序列化具有自定义名称的字段,java,serialization,yaml,pojo,snakeyaml,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 = f

我正在尝试序列化一个具有如下字段的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(“名字”)
注释,如下所示

@SerializedName("first-name")
private String firstName;
snakeyaml
中是否有类似的内容。
snakeyaml
的依赖项详细信息如下:

        <dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
            <version>1.17</version>
        </dependency>
以上结果产生以下输出

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


对于遇到此问题的人,我通过使用替换和排除解决了此问题:

TypeDescription personDesc = new TypeDescription(Person.class);
personDesc.substituteProperty("first-name", Person.class, "getFirstName", "setFirstName");
personDesc.substituteProperty("last-name", Person.class, "getLastName", "setLastName");
personDesc.setExcludes("firstName", "lastName");

这对我来说很有效——至少在转储YAML时是这样。

Jackson可以序列化为YAML(事实上,它在幕后使用SnakeYAML),您可以使用
@JsonProperty
注释来实现这一点。请参见您需要描述哪些不起作用并显示您的代码(编辑问题)。我已添加了我试用过的代码,请查看。对不起,我忘记您需要定义一个
重新输入
,以便转储。再试一次。现在输出的两个值都如下,`cat sample.json first name:Kasun last name:Siyambalapitiya firstName:Kasun lastName:Siyambalapitiya`Hmm。这实际上似乎是SnakeYAML的一个限制,请参阅。我想不出一个微不足道的解决办法;您可能需要将
TypeDescription
子类化,以解决以下问题:(
Constructor constructor = new Constructor(Person.class);
Representer representer = new Representer();
TypeDescription personDesc = new TypeDescription(Person.class);
personDesc.substituteProperty("first-name", Person.class,
        "getFirstName", "setFirstName");
constructor.addTypeDescription(personDesc);
representer.addTypeDescription(personDesc);
Yaml yaml = new Yaml(constructor, representer);
// and then load /dump your file with it
TypeDescription personDesc = new TypeDescription(Person.class);
personDesc.substituteProperty("first-name", Person.class, "getFirstName", "setFirstName");
personDesc.substituteProperty("last-name", Person.class, "getLastName", "setLastName");
personDesc.setExcludes("firstName", "lastName");