当前位置: 首页 > 知识库问答 >
问题:

名为“defaultReference”的反序列化和多个反向引用属性

师成弘
2023-03-14

我试图使用Jackson 1.9将嵌套的JSON对象反序列化到POJO中,但遇到了麻烦。下面是我试图解析的类和示例JSON字符串。

(省略了getter和setter)

JSON字符串:

sellerJson = "[{\"id\":\"1\",\"first_name\":\"Joe\",\"last_name\":\"Sellerman\",\"company\":\"NY CANYON RANCH\"," +
                    "\"prorated_sellers\":[{\"first_name\":\"Steve\",\"last_name\":\"Jobs\",\"company\":\"NY CANYON RANCH\"}," +
                    "{\"first_name\":\"Lorne\",\"last_name\":\"Michaels\",\"company\":\"NY CANYON RANCH\"}]," +
                    "\"pens\":[{\"id\":\"2\",\"pen_no\":\"902\"}]}]";

Java类:

@Table(name="seller")
public class SellerModel implements Serializable, Comparable<SellerModel> {

    private static final long serialVersionUID = 201302111531L;

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

    @Column()
    private String first_name;

    @Column()
    private String last_name;

    @Column()
    private String company;

    @Column()
    private Boolean is_prorated;

    @JsonIgnore
    @ManyToOne()
    @JoinColumn(name="parent_seller_id", referencedColumnName="id")
    private SellerModel parent_seller;

    @JsonManagedReference(value="seller-prorated")
    @OneToMany(mappedBy = "parent_seller", cascade={CascadeType.ALL}, orphanRemoval=true)
    private List<SellerModel> prorated_sellers;

    @JsonManagedReference(value="seller-pen")
    @OneToMany(mappedBy = "parent_seller", cascade={CascadeType.ALL}, orphanRemoval=true)
    private List<PenModel> pens;
}

@Table(name="pen")
public class PenModel implements Serializable, Comparable<PenModel> {

    private static final long serialVersionUID = 201302111537L;

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

    @Column()
    private String pen_no;

    @JsonBackReference(value="pen-seller")
    @ManyToOne()
    @JoinColumn(name="parent_seller_id", referencedColumnName="id")
    private SellerModel parent_seller;

    @JsonManagedReference(value="pen-livestock")
    @OneToMany(mappedBy = "parent_pen", cascade={CascadeType.ALL}, orphanRemoval=true)
    private List<LivestockModel> livestock;
}

但是,当我尝试执行反序列化时:

List<SellerModel> sellers = (List<SellerModel>) mapper.readValue(sellerJson, 
                    mapper.getTypeFactory().constructCollectionType(List.class, SellerModel.class));

我收到以下异常消息:

JAVAlang.IllegalArgumentException:名为“defaultReference”的多个反向引用属性

我读到提供(value='something-unique')注释属性应该可以解决这个问题,但我没有任何运气。有人有什么建议吗?

共有1个答案

余歌者
2023-03-14

我至少看到两个问题。第一:

  • SellerModel.prorated_sellers注释为@JsonManaged参考(value="sell-pen")
  • PenModel.parent_seller注解为@JsonBack参考(value="pine-卖方")

他们必须有相同的名字,才能有关联。

第二:

  • SellerModel.parent_seller应该用@JsonManaged参考(value="sells-prorated")(托管)注释,并删除@JsonIgnore注释
  • SellerModel.prorated_sellers应该用@JsonBack参考注释(value="sells-prorated")(返回)
 类似资料:
  • 我在一个类中有多个反向引用类。由于我对它们使用了,所以我得到了一个错误。我为这些类分配了注释,但仍然得到相同的错误。 错误:

  • 当我试图将一个实体映射到多个实体时,我得到了这个错误。 ///这是我的候选人配置文件实体////////// ///这是我的体验详情实体////////////// ///这是我的角色实体////// 我得到的这个错误----------- 请帮帮我。我到处搜索,我尝试了每一个解决方案,但我也得到了这个错误。

  • 我试图将一个json(字符串格式)映射到一个对象,但我得到以下错误 JSONMappingException:多个名为“default reference”的反向引用属性 这是json字符串 我不知道这个错误,我做了完全相同的方式,我读杰克逊的主页。知道这件事的人请帮帮我

  • 问题内容: 我正在针对返回JSON数据的第三方API进行编程,但是格式可能有点奇怪。某些属性可以是一个对象(包含一个Id属性),也可以是一个字符串(它是该对象的ID)。例如,以下两个都是有效的: 和 我正在尝试使用JSON.net将其反序列化为强类型类,但到目前为止运气还不足。我最好的主意是将其序列化为两个属性,一个为字符串,另一个为对象,并为每个属性使用自定义JsonConverter以允许变量

  • 关于这个问题: 如何在使用JSON.NET序列化时更改属性名称? 会像预期的那样反序列化。 作为一个解决方案,没有属性也可以工作,或者类上有一个属性,比如:

  • 我的JSON字符串是: 我想要实现的是,当JSON中没有提供schemaVersion时,能够在默认情况下反序列化到SubClassV1,但即使在Superclass中将schemaVersion初始化为“1.0”时,我仍然会收到以下错误: