gpt4 book ai didi

java - 我可以告诉 Jackson 根据不同类型的方法有条件地序列化私有(private)实例变量吗?

转载 作者:行者123 更新时间:2023-11-30 02:09:03 27 4
gpt4 key购买 nike

据我所知, jackson 会

  • 将公共(public)实例变量序列化为变量名

    public List<String> myStrings = new ArrayList<>();

    序列化为

    { 'myStrings' : [ ... ] }

  • 如果私有(private)实例变量具有名为 getVariable() 的公共(public) getter,则将其序列化为变量名称。 :

    private List<String> myStrings = new ArrayList<>();
    public List<String> getMyStrings() { return myStrings; }

    序列化类似于

    { 'myStrings' : [ ... ] }

<小时/>

但是,我想要实现的是基于另一种方法将其序列化为字符串(而不是字符串数组),但保留 JSON 键(基于 @JsonInclude(JsonInclude.Include.NON_NULL) 在某些情况下抑制原始访问器

    @JsonInclude(JsonInclude.Include.NON_NULL)

private boolean firstStringOnly = true;
private List<String> myStrings = new ArrayList<>();
public List<String> getMyStrings() { return firstStringOnly ? null: myStrings; }
public String getFirstString() { return firstStringOnly ? myStrings.get(0) : null; }

所需的 JSON 序列化:

  • 对于 firstStringOnly==true :{ 'myStrings' : 'first_String' } (使用getFirstString())

  • 对于 firstStringOnly==false :{ 'myStrings' : [ ... ] } (使用getMyStrings())

这可以做到吗?我特别希望避免使用自定义序列化器,而仅通过注释来执行此操作。

您可以假设使用 Jackson 和 Java 8 的最新版本。

重申一下,问题限制是:

* 没有自定义序列化器

* 两个用例生成相同的 JSON key

最佳答案

您可以概括 getMyStrings() 方法并使其返回 Object。并在内部检查标志并返回第一个值或所有值。这是我的样本

public class tst {
private static class YourObject {

private boolean firstStringOnly;
private List<String> myStrings = new ArrayList<>();

public YourObject(boolean firstStringOnly) {
this.firstStringOnly = firstStringOnly;
this.myStrings.add("str1");
this.myStrings.add("str2");
}
public Object getMyStrings(){
return firstStringOnly ? myStrings.get(0) : myStrings;
}

}

public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(new YourObject(true)));
System.out.println(mapper.writeValueAsString(new YourObject(false)));
}
}

输出为

{"myStrings":"str1"}
{"myStrings":["str1","str2"]}

关于java - 我可以告诉 Jackson 根据不同类型的方法有条件地序列化私有(private)实例变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50625573/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com