如何删除@JsonIdentityInfo不必要的ID?

时间:2014-04-14 22:40:18

标签: java json hibernate annotations

我对@JsonIdentityInfo有疑问。我在json文件中获得了两个id。

{
  "name" : "Tim",
  "@id" : 1, // fasterxml garbage
  "id" : 3,
  "company" : {
    "name" : "Microsoft",
    "employees" : [1], // garbage too
    "@id" : 2, // fasterxml garbage
    "id" : 3
  }
}

这是我的实体:

@Entity
@Table(name = "company")
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "id")
public class Company implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column
    private String name;

    @OneToMany(mappedBy = "company")
    @Cascade(value = CascadeType.ALL)
    private Collection<Employee> employees;

如何删除不必要的ID?

UPD:

我正在使用com.fasterxml.jackson

2 个答案:

答案 0 :(得分:2)

这是一个老问题,你现在可能已经得到了答案,但是通过阅读它,看起来你的问题来自你使用的生成器。

IntSequenceGenerator会让杰克逊生成自动递增的ID,并且您指定要将它们作为id属性(并且因为您已经拥有id属性,我猜这&#39为什么杰克逊产生@id)。你想要的是杰克逊使用你现有的id财产,为此你只需要使用PropertyGenerator

您还需要在注释上使用scope属性,并在Employee类上使用它,因为您有两个独立的 id 序列。< / p>

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope=Company.class)
public class Company {}

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope=Employee.class)
public class Employee {}

这应该为您的示例生成

{
  "name" : "Tim",
  "id" : 3,
  "company" : {
    "name" : "Microsoft",
    "employees" : [3],
    "id" : 3
  }
}

答案 1 :(得分:0)

您可以使用这样的JSON注释来忽略它们:

import org.codehaus.jackson.annotate.JsonIgnoreProperties;

@JsonIgnoreProperties({"id", "name"})

创建JSON对象时,“id”和“name”不在JSON对象中。