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

在Jackson中避免在运行时序列化某些字段

隆向晨
2023-03-14

我有一个产生JSON的控制器,从这个控制器,我返回一个实体对象,它由Jackson自动序列化。

现在,我想避免根据传递给控制器的参数返回一些字段。我查看了使用过滤器属性/Mixins等完成此操作的示例。但是我看到的所有示例都要求我使用对象映射器手动序列化/反序列化 Bean。有没有办法在没有手动序列化的情况下执行此操作?我的代码与此类似:

@RestController
@RequestMapping(value = "/myapi", produces = MediaType.APPLICATION_JSON_VALUE)
public class MyController {
    @Autowired
    private MyService myService;

    @RequestMapping(value = "/test/{variable}",method=RequestMethod.GET)
    public MyEntity getMyEntity(@PathVariable("variable") String variable){
        return myservice.getEntity(variable);
    }
}

@Service("myservice")
public class MyService {
    @Autowired
    private MyEntityRepository myEntityRepository;

    public MyEntity getEntity(String variable){
        return myEntityRepository.findOne(1L);
    }
}


@Entity  
@Table(name="my_table")
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyEntity implements Serializable {

    @Column(name="col_1")
    @JsonProperty("col_1")
    private String col1;

    @Column(name="col_2")
    @JsonProperty("col_2")
    private String col2;

    // getter and setters
}

现在,根据传递给控制器的“变量”值,我想显示/隐藏MyEntity的col2。我不想手动序列化/反序列化类。有什么方法可以做到这一点吗?我可以在外部更改Mapper Jackson用于根据“变量”的值序列化类吗?

共有2个答案

钦高峯
2023-03-14

使用此注释并将值设置为null,它将不会序列化:

@JsonInclude(Include.NON_NULL)
浦泳
2023-03-14

将JsonView与MappingJacksonValue结合使用。

考虑以下示例:

class Person {
    public static class Full {
    }

    public static class OnlyName {
    }

    @JsonView({OnlyName.class, Full.class})
    private String name;

    @JsonView(Full.class)
    private int age;

    // constructor, getters ...
}

然后在Spring MVC控制器中:

@RequestMapping("/")
MappingJacksonValue person(@RequestParam String view) {
    MappingJacksonValue value = new MappingJacksonValue(new Person("John Doe", 44));
    value.setSerializationView("onlyName".equals(view) ? Person.OnlyName.class : Person.Full.class);
    return value;
}
 类似资料:
  • 我有一个由Spring MVC框架构建的RESTful项目,使用Mybatis ORM。 我启用了延迟加载,这样当我查询 Book 时,它不会查询 Author,除非我调用 book.getAuthor() 方法,并且一切正常。 但是,当 RESTful 控制器返回 Book 对象时,它使用 Jackson 将 Book 对象传输到 json,并触发 mybatis 加载 Author 对象。 有

  • 问题内容: 有没有一种使用Jackson JSON Processor进行自定义字段级序列化的方法?例如,我想上课 序列化为以下JSON: 请注意,age = 25被编码为 数字, 而favoriteNumber = 123被编码为 string 。开箱即用的杰克逊将集结到一个号码。在这种情况下,我希望将favoriteNumber编码为字符串。 问题答案: 您可以实现自定义序列化器,如下所示:

  • 我有一个错误: 我一直试图避免导致此被序列化的字段,但错误没有得到纠正。我试图把@JsonIgnore放在任何地方,在getter、setter、属性和所有可能的组合中。 谢啦 - 我无法导入com。谷歌。阿彭金。重新包装。组织。科德豪斯。杰克逊。注释JsonIgnoreProperties说,“使用com.google.appengine.repacked可能会导致你的应用程序在没有警告的情况下

  • 问题内容: 我有一个返回用户对象的简单控制器,该用户的属性坐标具有hibernate属性FetchType.LAZY。 当我尝试获取该用户时,我总是必须加载所有坐标才能获取用户对象,否则,当杰克逊尝试序列化User时,将抛出异常: :无法初始化代理-没有会话 这是由于Jackson尝试获取此未获取的对象。这里是对象: 和控制器: 有一种方法告诉杰克逊不要序列化未提取的对象?我一直在寻找3年前发布的

  • 问题内容: 我有一个返回用户对象的简单控制器,该用户的属性坐标具有hibernate属性FetchType.LAZY。 当我尝试获取该用户时,我总是必须加载所有坐标才能获取用户对象,否则,当杰克逊尝试序列化User时,将抛出异常: com.fasterxml.jackson.databind.JsonMappingException:无法初始化代理-没有会话 这是由于Jackson尝试获取此未获取

  • Jackson序列化到JSON有一些很好的特性,比如SerializationFeature.write_null_map_values,它允许您避免将null写入序列化对象。 但是,如果我使用自定义的JsonSerializer,这个设置将被忽略,并且我被迫在对WriteStringField的所有调用中进行空检查。例如,我注册了一个自定义的JSONSerializer: 然后在ImportPr