【问题标题】:Avoid serialization of certain fields at runtime in Jackson避免在杰克逊运行时序列化某些字段
【发布时间】:2017-02-15 15:53:42
【问题描述】:

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

现在,我想避免基于传递给控制器​​的参数返回一些字段。我查看了使用 FilterProperties / Mixins 等完成此操作的示例。但是我看到的所有示例都要求我使用 ObjectMapper 手动序列化/反序列化 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 用于根据“变量”的值对类进行序列化吗?

【问题讨论】:

  • 我对@9​​87654322@ 的回答对您有用还是您仍有一些问题?

标签: java json spring-boot jackson


【解决方案1】:

将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;
}

【讨论】:

    【解决方案2】:

    使用这个注解并将值设置为null,它不会被序列化:

    @JsonInclude(Include.NON_NULL)
    

    【讨论】:

    • 谢谢,但我做不到。我在其他字段上使用“空”值来执行其他操作。所以我需要 JSON 中的空值。
    猜你喜欢
    • 2012-08-16
    • 2021-04-26
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2013-07-10
    • 2014-05-05
    • 2021-04-02
    相关资源
    最近更新 更多