如何在 Java 中使用蛇 yaml 序列化具有自定义名称的字段
Posted
技术标签:
【中文标题】如何在 Java 中使用蛇 yaml 序列化具有自定义名称的字段【英文标题】:How to serialize fields with custom names using snake yaml in Java 【发布时间】:2019-06-18 11:48:42 【问题描述】:我正在尝试序列化具有如下字段的 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
【问题讨论】:
Jackson 可以序列化为 YAML(实际上,它在后台使用了 SnakeYAML),您可以使用@JsonProperty
注解来做到这一点。见***.com/questions/35217410/…
【参考方案1】:
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
【讨论】:
您需要描述 what 不起作用并显示您的代码(编辑问题)。 我已经添加了我试过的代码,请看一下 对不起,我忘了你需要定义一个Representer
来进行转储。再试一次。
现在输出具有如下两个值,` cat sample.json first-name: Kasun last-name: Siyambalapitiya firstName: Kasun lastName: Siyambalapitiya `
嗯。这实际上似乎是 SnakeYAML 的限制,请参阅this issue。我想不出一个简单的解决方案;您可能需要将TypeDescription
子类化以获得解决方法:(【参考方案2】:
对于那些遇到这个问题的人,我通过使用替换和排除来解决它:
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。
【讨论】:
以上是关于如何在 Java 中使用蛇 yaml 序列化具有自定义名称的字段的主要内容,如果未能解决你的问题,请参考以下文章