【问题标题】:How to exclude in JSON property of an object (inside output class)?如何在对象的 JSON 属性中排除(在输出类中)?
【发布时间】:2018-01-04 11:36:15
【问题描述】:

假设我是一个将转换为 JSON 的输出类:

StudentSummary.java

public class StudentSummary {

    private StudentList studentList;

    // getters setters
}

和

StudentList.java

public class StudentList {

    private int numberOfStudents;
    private int totalExpenditures;
    private List<Student> students;

    // getters setters
}

进行服务调用后,我得到以下 JSON 输出:

{ 
 "studentSummary": {
     "studentList": {
         "numberOfStudents": 500,
         "totalExpenditures": 250000,
         "students": [ /* students listed */ ]
     }
}

我想从 JSON 中排除 studentList StudentSummary 类:

{ 
 "studentSummary": {
     "studentList": {
         "numberOfStudents": 500,
         "totalExpenditures": 250000
      }
  }
}

我已经尝试使用(在 StudentSummary 输出类中)@JsonIgnore 和 @JsonProperties,通过指定仅排除 "studentList.students",但这没有任何作用。

编辑:进一步澄清,为什么我不能在 StudentList 类中进行更改,这是因为它被另一个服务使用,而 StudentSummary 类的服务属于不同的服务,所以我只能在里面进行更改后一个类,不修改前一个服务。

【问题讨论】:

  • 您是否尝试将 @JsonIgnore 放在 StudentList 类的“学生”字段中?
  • @Kh.Taheri 我在底部添加了一个编辑,但基本上,StudentList 由不同的服务使用,而我现在要编写的服务只需要对里面的 JSON 输出进行更改StudentSummary 类。

标签: java json object properties jackson


【解决方案1】:

总结

这将解决您的问题:

public class StudentSummary {

    @JsonIgnoreProperties(value = { "students" })
    public StudentList studentList = new StudentList();

您不需要编辑StudentList 类。

所有测试类定义

学生

public class Student {

    String name = "Student" + Math.random()*100;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

学生名单

public class StudentList {

    int numberOfStudents;
    int totalExpenditures;
    List<Student> students = new ArrayList<>();

    public StudentList(){
        for(int i =0; i<10; i++){
            students.add(new Student());
        }
    }

    public int getNumberOfStudents() {
        return numberOfStudents;
    }

    public void setNumberOfStudents(int numberOfStudents) {
        this.numberOfStudents = numberOfStudents;
    }

    public int getTotalExpenditures() {
        return totalExpenditures;
    }

    public void setTotalExpenditures(int totalExpenditures) {
        this.totalExpenditures = totalExpenditures;
    }

    public List<Student> getStudents() {
        return students;
    }

    public void setStudents(List<Student> students) {
        this.students = students;
    }

    //getters setters
}

学生总结

public class StudentSummary {

    @JsonIgnoreProperties(value = { "students" })
    public StudentList studentList = new StudentList();

    public StudentSummary(){
        studentList = new StudentList();
    }

    public StudentList getStudentList() {
        return studentList;
    }

    public void setStudentList(StudentList studentList) {
        this.studentList = studentList;
    }

    //getters setters
}

主类

ObjectMapper mapper = new ObjectMapper();

StudentSummary summary = new StudentSummary();
String test = mapper.writeValueAsString(summary);
System.out.println(test);
System.out.print("DONE");

【讨论】:

  • 谢谢,这是我正在寻找的解决方案!
【解决方案2】:

如果不能修改类的源代码,需要创建Mixin类来省略Studentlist ...

点击以下链接查看 Jackson Mixin..

How can I tell jackson to ignore a property for which I don't have control over the source code?

【讨论】:

    【解决方案3】:

    您可以使用@JsonIgnoreProperties 或@JsonIgnore 在JSON 序列化时忽略类的任何属性。例如

    ***public class StudentList {
    int numberOfStudents;
    int totalExpenditures;
    @JsonIgnore
    List<Student> students;
    //getters setters
    }***
    

    或者

    ***@JsonIgnoreProperties(value = { "students" })
    public class StudentList {
    int numberOfStudents;
    int totalExpenditures;
    List<Student> students;
    //getters setters
    }***
    

    【讨论】:

    • 我认为你应该先阅读问题下的cmets。
    • 如果你不能改变类的源代码,你需要创建一个Mixin类来省略Studentlist ...点击下面的Jackson Mixin链接。stackoverflow.com/questions/7421474/…
    【解决方案4】:

    我相信从这个问题你不能接触StudentList 类,一切都应该从StudentSummary 类处理。我的想法是创建另一个类SpecialStudent 并覆盖学生列表的setter/getter,然后将@JsonIgnore 属性放在它们上面。以下是相同的示例。让我知道这是否有帮助

    class SpecialStudent extends StudentList{
        @JsonIgnore
        @Override
        public List<Student> getStudents()
        {
            return students;
        }
        /**
         * @param students the students to set
         */
        @Override
        @JsonIgnore
        public void setStudents(List<Student> students)
        {
            this.students = students;
        }
    }
    

    学生总结应该是这样的

    public class StudentSummary
    {
        SpecialStudent studentList;
    
        /**
         * @return the studentList
         */
        public StudentList getStudentList()
        {
            return studentList;
        }
    
        /**
         * @param studentList the studentList to set
         */
        public void setStudentList(SpecialStudent studentList)
        {
            this.studentList = studentList;
        }
    
    }
    

    测试类

    StudentSummary sum = new  StudentSummary();
            SpecialStudent l = new SpecialStudent();
            l.setNumberOfStudents(4);
            l.setTotalExpenditures(12);
            sum.setStudentList(l);
    
    
            ObjectMapper mapper = new ObjectMapper();
            String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(sum);
    
            System.out.println(json);
    

    输出

    {
      "studentList" : {
        "numberOfStudents" : 4,
        "totalExpenditures" : 12
      }
    }
    

    【讨论】:

      【解决方案5】:

      我建议阅读here

      基本上,如果你不能修改类本身的任何东西,那么你需要全局告诉杰克逊如何在序列化配置上处理这个(通过对象映射器上的混合注释)

      【讨论】:

        【解决方案6】:

        由于您无法更改 StudentList;您不需要在 StudentSummary 中包含 StudentList 的实例。因此,您可以进行如下映射:

         public class StudentSummary {
        
            int numberOfStudents;
            int totalExpenditures;
        
            public StudentSummary (){
                 StudentList studentList = new StudentList();
                 this.numberOfStudents = studentList.getNumberOfStudents();
                 this.totalExpenditures = studentList.getTotalExpenditures();
            }
        
            //getters setters for numberOfStudents & totalExpenditures
          }
        

        【讨论】:

        • 操作员询问如何从输出中隐藏此字段。从类定义中删除它当然可以解决问题,但这不是所要求的解决方案。我们希望将列表保留在 java 类中。对不起!
        • @MenelaosBakopoulos -- 他说他不能更新 StudentList 类!你看过问题下的cmets吗!!
        • @Kh.Taheri 你是对的,不应该对 StudentList.class 进行任何修改。您提供的解决方案并没有真正回答我的问题,因为我想知道是否有一种方法可以使用注释来排除 JSON 输出的属性。在我的现实生活场景中,我有大约 9 种不同的服务,所有这些服务都包含一些我不想要的东西(其中也有一个列表)
        猜你喜欢
        • 1970-01-01
        • 2016-01-07
        • 2018-03-04
        • 2023-03-03
        • 2012-09-10
        • 2019-09-15
        • 2015-03-10
        • 2020-04-27
        • 1970-01-01
        相关资源
        最近更新 更多