如果您不想在REST API 层上创建新的POJO 模型来表示JSON,则需要在传递到Jackson 层之前准备ORM 模型。
启用 HibernateXModule
您应该从启用最适合您的Hibernate 版本的Hibernate module 开始。它解决了lazy-loadings 和内部数据类型的许多问题。
双向关系
Read about options 其中Jackson 用于解决序列化期间的循环问题。主要注解有:
定义适当的可见性
您可以在ObjectMapper、how to specify jackson to only use fields - preferably globally 上定义全局可见性,并在需要时使用JsonAutoDetect 注释对给定类进行自定义。
查看POJO型号
可能在大多数情况下,您将能够重用为ORM 创建的POJO 模型。如果使用注释自定义 JSON 输出会很困难,您始终可以创建自定义类并在额外的映射/业务层中手动将 ORM 模型映射到该模型。
自定义序列化程序
如果您需要以一般方式处理某些自定义注释或某些字段,您可以使用BeanSerializerModifier 和BeanPropertyWriter。这并不容易实现,但它非常强大。在此处查看示例用法:Jackson custom serialization and deserialization。
如何实现双向关系和可见性配置的简单示例:
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.util.Arrays;
import java.util.List;
public class JsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
Item item0 = new Item();
item0.setId(1);
item0.setItemName("Item 0");
Item item1 = new Item();
item1.setId(2);
item1.setItemName("Item 1");
List<Item> items = Arrays.asList(item0, item1);
User user = new User();
user.setId(123);
user.setName("Rick");
user.setUserItems(items);
items.forEach(item -> item.setOwner(user));
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(mapper.getSerializationConfig().getDefaultVisibilityChecker()
.withFieldVisibility(JsonAutoDetect.Visibility.ANY)
.withGetterVisibility(JsonAutoDetect.Visibility.NONE)
.withSetterVisibility(JsonAutoDetect.Visibility.NONE)
.withCreatorVisibility(JsonAutoDetect.Visibility.NONE));
System.out.println(mapper.writeValueAsString(user));
}
}
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
class User {
private int id;
private String name;
private List<Item> userItems;
// getters, setters
}
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
class Item {
private int id;
private String itemName;
private User owner;
// getters, setters
}
上面的代码打印:
{"id":123,"name":"Rick","userItems":[{"id":1,"itemName":"Item 0","owner":123},{"id":2,"itemName":"Item 1","owner":123}]}