当前位置: 首页 > 面试题库 >

杰克逊:从json中删除一些值并保留一些空值

邢修明
2023-03-14
问题内容

我有一个像这样的模型:

public class Employee {
    @JsonProperty("emplyee_id")
    private Integer id;
    @JsonProperty("emplyee_first_name")
    private String firstName;
    @JsonProperty("emplyee_last_name")
    private String lastName;
    @JsonProperty("emplyee_address")
    private String address;
    @JsonProperty("emplyee_age")
    private Byte age;
    @JsonProperty("emplyee_level")
    private Byte level;

    //getters and setters
}

现在,我需要使用此(仅)模型创建两个JSON。

例如,第一个必须这样:

{
    "employee_id":101,
    "employee_first_name":"Alex",
    "employee_last_name":"Light",
    "employee_age":null,
    "employee_address":null
}

第二个必须像这样:

{
    "employee_id":101,
    "employee_level":5
}

顺便说一句,我已经测试了@JsonIgnore@JsonInclude(JsonInclude.Include.NON_NULL)

第一个问题(据我所知)是,这些字段不能包含在其他JSON中(例如,如果level获取此批注,它将不包含在第二个JSON中)

第二个问题是,null值不能包含在JSON中。

所以我可以保留空值并防止在不创建额外模型的情况下将某些其他属性包含在JSON中吗?如果答案是肯定的,那我该怎么办?如果不是,我真的很感谢有人为我提供这种状态的最佳解决方案。

非常感谢。


问题答案:

使用@JsonView批注可能对您有用

public class Views {
    public static class Public {
    }
    public static class Base {
    }
 }



public class Employee {
   @JsonProperty("emplyee_id")
   @JsonView({View.Public.class,View.Base.class})
   private Integer id;

   @JsonProperty("emplyee_first_name")
   @JsonView(View.Public.class)
   private String firstName;

   @JsonProperty("emplyee_last_name")
   @JsonView(View.Public.class)
   private String lastName;

   @JsonProperty("emplyee_address")
   private String address;

   @JsonProperty("emplyee_age")
   private Byte age;

   @JsonProperty("emplyee_level")
   @JsonView(View.Base.class)
   private Byte level;

   //getters and setters
 }

在您的json响应中添加@JsonView(Public / Base.class),它将基于jsonview批注返回

//requestmapping
@JsonView(View.Public.class)  
public ResponseEntity<Employee> getEmployeeWithPublicView(){
    //do something
}

响应:

{ 
  "employee_id":101,
  "employee_first_name":"Alex",
  "employee_last_name":"Light",
  "employee_age":null,
  "employee_address":null
}

第二个

//requestmapping
@JsonView(View.Base.class)  
public ResponseEntity<Employee> getEmployeeWithBaseView(){
    //do something
}

响应

{
   "employee_id":101,
   "employee_level":5
}


 类似资料:
  • 问题内容: 我有一个特定的JSON节点,它对应于导入org.codehaus.jackson.JsonNode,而不是导入org.codehaus.jackson.map.JsonNode。 我想从上述数组的所有JSON节点中删除“ familyName”和“ middleName”。有什么办法可以做到这一点? 问题答案: 我还没有测试过,但是我认为这样可以满足您的需求: 您还可以使用Jackon

  • 我还在学习如何使用Jackson。。。 所以我有一个JSON对象,它的值有时是整数、长字符串或列表 值:整数 值:字符串 价值:列表 所以总的来说。。。 这是我的POJO模型 这是我的映射器代码 问题是,当我执行代码时,出现以下错误: 我很清楚,之所以会发生这种情况,是因为“value”可以包含三种不同类型中的一种,我如何使代码足够灵活以适应这些类型。。。我总是可以在其他方法中检测值是int、Li

  • 我如何告诉Jackson忽略JSON名称? 我有以下POJO: 当我有这样的东西: “ABCName”:“foo”,然后杰克逊没有认出它抛出错误。 它期望的是: “abcName”:“foo”。 代码: 输出:{"abcname":"Foo"} 然后我试着用@JsonProperty(“ABCName”)注释ABCName 在我注释并运行代码之后,我得到的是:{“ABCName”:“Foo”,“A

  • 问题内容: 我有以下json文件: 但是java模型如下: Jackson解析时会引发异常,因为“ externalId”字段没有getter或setter方法。有没有可以用来忽略json字段的装饰器? 问题答案: 您可以使用注释;如果这只是您要跳过的一个值,则类似于: 或忽略任何无法使用的东西: 还有其他方法可以做到这一点,其余的请查看FasterXML Jackson wiki 。

  • 我正在Jackson中寻找一种方法来允许根据根元素序列化关系。例如,我有一个不是真正的父/子关系。两个实体都可以查询。 JsonBackReference使得序列化为json时没有循环引用。然而,这也导致我不知道公司的地址。如果我是上市公司,那么地址会回来,一切都很好。但如果我列出地址,我希望看到公司被序列化。有没有办法做到这一点?

  • 我想使用Spring的RestTemplate plus Jackson来使用Web服务。我已经学习了几本教程,并且已经达到了创建DAO的目的。这是我获取所有域对象的方法: 但我的Web服务不会立即返回Station对象数组,而是以这种方式返回一个更具语义的表达式: 所以我的问题是,我不知道如何“告诉”RestTemplate在“stations”指示符之后立即解析对象列表,而不创建临时对象,这似