论坛首页 Java企业应用论坛

spring restful 返回json的问题

浏览 4671 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2016-06-22  
orm用的是hibernate
实体类:
@Entity
public class User {
private static final long serialVersionUID = 1L;
    @Id
    private String id;
    private String name;
    private int age;
    @OneToOne
    private Account account;
}
@Entity
public class Account {
private static final long serialVersionUID = 1L;
    @Id
    private String id;
    private double amount;
    @OneToOne
    private User user;
}
RestController:
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserDao userDao;
    @RequestMapping(value="", method = RequestMethod.GET)
    public List<User> findAllUser() {
        List<User> users = userDao.findAll();
        return users;
    }
}
比如这样的一个查询,最终返回的users是会用jackson解析成json再传回前端的,但由于这里User实体里包含Account,Account又包含User,这样的情况下解析就会陷入死循环,不知道有没有人遇到过这种问题,是怎么解决的呢?
   发表时间:2016-06-22  
把@JsonIgnore注解放在实体类的某个属性上,就能不让这个属性在 json 中解析了

@JsonIgnore
private User user;
1 请登录后投票
   发表时间:2016-07-03  
  @JsonIgnore有缺限,比如

public class A {
   private Collection<B> bs;
}
public class B {
   @JsonIgnore
   private Collection<A> as;
}

  这里,废掉了B.as字段。如果业务要求返回A并附带B,当然可以。但是如果有另外一种业务,正好相反,要求返回B并附带A,那么就不可能了 。对于复杂的应用,这种不对称的硬编码忽略是致命的。

  判断某种数据序列化/反序列化机制是好是坏的一个重要标准,就是能否传递对象之间的循环引用(当然,最简单也最常见的对象环形关系就是对象之间的双向关系)。

   可以使用Alibaba的FastJson,默认情况下,它扩展了JSON,可以表达对象图内部任意复杂的环形引用。对反序列化的解析一方而言,如果是Java,可以直接还原出对象之间的环形引用;对于JavaScript,需要自己开动一下脑筋来还得到带有环形引用的JS对象图,不过也很简单。

   除了这个逆天的功能外,AlibabaFastJson在性能上也是逆天的,一次性生成字节码(字节码内部是硬编码逻辑,无反射)来无反射读写对象,性能比任何使用反射来实现对象读写的二进制或文本协议的序列化协议高很多,尤其是被转化对象成千上万时尤为明显,这也是为什么取名为FastJson的原因。
0 请登录后投票
   发表时间:2016-07-05  
babyfish-ct 写道
  @JsonIgnore有缺限,比如

public class A {
   private Collection<B> bs;
}
public class B {
   @JsonIgnore
   private Collection<A> as;
}

  这里,废掉了B.as字段。如果业务要求返回A并附带B,当然可以。但是如果有另外一种业务,正好相反,要求返回B并附带A,那么就不可能了 。对于复杂的应用,这种不对称的硬编码忽略是致命的。

  判断某种数据序列化/反序列化机制是好是坏的一个重要标准,就是能否传递对象之间的循环引用(当然,最简单也最常见的对象环形关系就是对象之间的双向关系)。

   可以使用Alibaba的FastJson,默认情况下,它扩展了JSON,可以表达对象图内部任意复杂的环形引用。对反序列化的解析一方而言,如果是Java,可以直接还原出对象之间的环形引用;对于JavaScript,需要自己开动一下脑筋来还得到带有环形引用的JS对象图,不过也很简单。

   除了这个逆天的功能外,AlibabaFastJson在性能上也是逆天的,一次性生成字节码(字节码内部是硬编码逻辑,无反射)来无反射读写对象,性能比任何使用反射来实现对象读写的二进制或文本协议的序列化协议高很多,尤其是被转化对象成千上万时尤为明显,这也是为什么取名为FastJson的原因。

fastjson 一直都不是最快,看看这个报告  http://redkale.org/article_convert.html
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics