2 回答
TA贡献1803条经验 获得超3个赞
如果不想创建新模型以在级别上进行表示,则需要在传递到层之前准备模型。POJOJSONREST APIORMJackson
启用休眠X模块
您应该从启用最适合您的版本的Hibernate模块开始。它解决了许多内部数据类型问题。Hibernatelazy-loadings
双向关系
阅读有关在序列化过程中解决周期问题的选项。主要注释包括:Jackson
定义适当的可见性
您可以在 上定义全局可见性,如何指定 jackson 以仅使用字段 - 最好是全局的,如果需要使用 JsonAutoDetect 注释为给定类自定义它。ObjectMapper
查看模型POJO
可能在大多数情况下,您将能够重用为 创建的模型。如果使用注释自定义输出非常困难,您可以随时在额外的映射/业务层中手动创建自定义类并将模型映射到此类和模型。POJOORMJSONORM
自定义序列化器
如果您需要以一般方式处理某些自定义注释或某些字段,则可以使用BeanSerializerModifier和BeanPropertyWriter。它不容易实现,但它非常强大。请参阅此处的示例用法:Jackson 自定义序列化和反序列化。
如何为双向关系和可见性配置完成的简单示例:
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}]}
添加回答
举报
