当前位置: 首页 > 知识库问答 >
问题:

我可以告诉Jackson基于不同类型的方法有条件地序列化私有实例变量吗?

田焕
2023-03-14

据我所知,杰克逊会

>

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

    <代码>公共列表

    序列化到

    <代码>{“myStrings”:[…]}

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

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

    序列化类似于

    <代码>{“myStrings”:[…]}

    然而,我试图实现的是基于另一种方法将其序列化为字符串(而不是字符串数组),但在某些情况下保留JSON键(基于JsonInclude(JsonInclude.Include.NON\u 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\u String”}(使用getFirstString())

    对于firstStringOnly==false:{“myStrings”:[…]} (使用getMyStrings()

    这可能吗?我特别希望避免使用自定义序列化程序,并且只通过注释来实现这一点。

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

    只是重复一下,问题约束是:

  • 共有2个答案

    焦信鸥
    2023-03-14

    编辑:对不起,我误解了你最初的问题。我假设你想保留两个键入的getter。这对你有用吗?

    public class TestClass {
    
      private boolean firstStringOnly = true;
      private List<String> myStrings = new ArrayList<>();
    
      @JsonIgnore
      public boolean isFirstStringOnly() {
        return firstStringOnly;
      }
    
      public void setFirstStringOnly(boolean firstStringOnly) {
        this.firstStringOnly = firstStringOnly;
      }
    
      @JsonIgnore
      public List<String> getMyStrings() {
        return firstStringOnly ? null : myStrings;
      }
    
      @JsonIgnore
      public String getFirstString() { return firstStringOnly ? myStrings.get(0) : null; }
    
      @JsonProperty("myStrings")
      public Object getMyStringsForSerialization() {
        return firstStringOnly ? getFirstString() : getMyStrings();
      }
    
      public void setMyStrings(List<String> myStrings) {
        this.myStrings = myStrings;
      }
    
    高高雅
    2023-03-14

    您可以泛化getMyStrings()方法并使其返回对象。并在内部检查标志并返回第一个值或所有值。这是我的样品

    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"]}
    
     类似资料:
    • 我有一个类(消息),它有一些实例变量。其中一个变量的类型是interface(MessageContent)。在将这个类序列化为json的过程中,我希望使用依赖于实现的名称序列化这个变量(内容)。下面是详细信息的代码片段: 我的要求是,当消息序列化并且内容类型为VideoMessage时,序列化的json应该是: 如何通过fasterxml Jackson实现?我正在使用ObjectMapper的

    • 序列化和反序列化的方式不同于 我已经创建了两个序列化程序 和 我用Jackson查看了序列化/反序列化映射 ,但找不到解决方案。

    • 在 Go 语言中通过首字母大小写来控制变量、函数、方法、类型的公私有 如果首字母小写,那么代表私有,仅在当前包中可以使用 如果首字母大写,那么代表共有,其它包中也可以使用 package demo import "fmt" var num1 int = 123 // 当前包可用 var Num1 int = 123 // 其它包也可用 type person struct {

    • 根据本·施耐德曼(Ben Shneiderman)的分类,信息可视化的数据分为:一维数据、二维数据、三维数据、多维数据、时态数据、层次数据和网络数据。大数据可视化研究的领域主要包含:多维数据、时态数据、层次数据和网络数据。 时态数据的可视化 时间数据广泛存在于不同的应用中,例如医疗记录、项目管理或历史介绍。数据集中的每一项包含时间信息,如开始和结束时间。用户潜在的需求是搜索在某些事件或时刻之间、之

    • 我的Spring Boot API使用camelCase,但我需要通过我的API将一些请求代理到使用snake_case的第三方API。是否可以将Jackson配置为从snake_case反序列化第三方响应,然后将其序列化回camelCase到我的前端? 所需功能的逐步示例: 示例对象: 我调用我的API API调用第三方 第三方返回 我的API将其反序列化为 我的API序列化对象并返回 现在我使

    • 我有一个现有的C#泛型类,希望根据使用的类型添加或删除一个方法,我解释道 对于特定的