Hibernate使用GSON将对象检索到Json

时间:2013-09-17 13:51:31

标签: json spring hibernate spring-mvc gson

我使用Spring MVC + Hibernate开发了这个webapp。

我检索服务中的所有对象,然后将它们直接返回给控制器。这些对象通常是懒惰地初始化,因此集合是空的。

因此对象用户:

User
{
   int idUser;
   City city;
   String name;
   List<User> friends;
}

我返回一个只有idUser和name的对象,City和Friends没有初始化。

我想利用我所有的服务方法(不修改它们)来提供REST API,所以如果从我的ApiController请求获取id为1的用户,我将在JSON中检索有关该用户的所有有用信息。 / p>

我尝试使用GSON,但是一旦它试图将城市对象jsonize它崩溃了,因为它已经被懒惰地初始化了。朋友收藏也一样。

对于集合而言,这并不是什么大不了的事,因为在我的api中我会有另一个请求url,你可以给所有朋友一个用户ID,但是在与一个对象的关系的情况下(如本例中的城市) ),我想返回城市的id,根据Lazy加载的定义确实设置了。

如何告诉GSON只将城市的cityId属性jsonize而不是整个对象?

将其余的集合归零是一个很好的解决方案,因此它们不会转换为JSON吗?有没有其他方法明确告诉GSON忽略这些属性?

1 个答案:

答案 0 :(得分:0)

我认为您需要将gson.toJson(...)放在一个事务中,在springMVC中通常是@Transactional,在控制器方法中,您正在进行实际的序列化。

如果您确实想跳过字段或有选择地序列化使用Gson的字段,可以检查https://stackoverflow.com/a/3341439是否有gson排除策略。您可以根据字段注释或字段名称或整个引用的类跳过。

Gson gson = new GsonBuilder().setExclusionStrategies(new ExclusionStrategy() {
    public boolean shouldSkipClass(Class<?> clazz) {
        return <class exclusion logic, return true for exclusion else false>;
    }
    public boolean shouldSkipField(FieldAttributes f) {
        return <field exclusion logic>;
    }
 }).create();