【问题标题】:How to serialize fields with custom names using snake yaml in Java如何在 Java 中使用蛇 yaml 序列化具有自定义名称的字段
【发布时间】: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   

【问题讨论】:

标签: java serialization yaml pojo snakeyaml


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

【讨论】:

    猜你喜欢
    • 2017-09-02
    • 2023-03-03
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多