【问题标题】:Deserializing JSON into Object with list attribute使用列表属性将 JSON 反序列化为对象
【发布时间】:2017-04-15 20:48:31
【问题描述】:

我有两个对象,具有 OneToMany 自我引用的 Product 和与 Image 的 OneToMany 关系。

从一个 Rest API,我需要创建 CRUD 服务。我创建了以下服务:

添加新产品: {“名称”:“椅子”, "description":"红色椅子"}

@Path("/product/add")
@Consumes("application/json")

添加新的子产品: {“名称”:“表”, "description":"红表"}

@Path("/product/{id}/addChild")
@Consumes("application/json")

为产品添加图片:

/product/1/image/添加

{"type":"PNG"}

@Path("/product/{id}/image/add")
@Consumes("application/json")

更新产品:

/product/update/1

{"名称":"椅子", "description":"蓝色椅子"}

@Path("/product/update/{id}")
@Consumes("application/json")

更新图片:

/image/update/1

{"type":"JPEG"}

@Path("/image/update/{id}")
@Consumes("application/json")

删除产品:

/product/delete/1

@DELETE
@Path("/product/delete/{id}")

删除图片:

/图像/删除/1

@DELETE
@Path("/image/delete/{id}")

Product.java:

@Entity
@Table
public class Product implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer productId;

@Column(name = "NAME")
private String name;

@Column(name = "DESCRIPTION")
private String description;

@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="PRODUCT_ID")
private List<Image> images;

@OneToMany(cascade=CascadeType.ALL, mappedBy="parent")
private List<Product> children;

@ManyToOne
@JoinColumn(name = "PARENT_PRODUCT_ID")
private Product parent;   

Image.java:

@Entity
@Table
public class Image implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer imageId;

@Column(name = "TYPE")
private String type;

@ManyToOne
@JoinColumn(name = "PRODUCT_ID", nullable = false)
private Product product;

当我尝试添加带有图片的产品时,出现错误:

{"名称":"桶", "description":"红桶", “图像”:{“类型”:“jpeg”} }

无法从 START_OBJECT 令牌中反序列化 java.util.ArrayList 的实例 在 [来源:org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@3c9786ad; line: 2, column: 27] (通过引用链: br.com.model.Product["images"])

需要帮助:

  1. 用一个 JSON 添加一个带图片的产品;
  2. 添加子产品的方式是否正确(使用PathParam)?

【问题讨论】:

    标签: java json rest jersey jax-rs


    【解决方案1】:

    您在 json 字符串中的 images 属性不是数组/列表,它是一个对象。它也应该用[] 封装,而不仅仅是{}。这就是反序列化失败的原因。

    【讨论】:

    • 你的意思是这样的:{"name":"bucket", "description":"red bucket", "images":["type":"jpeg"] }
    • 不,像这样:{"name":"bucket", "description":"red bucket", "images":[{"type":"jpeg"}] }
    • 尝试但没有成功,这是在码头日志上打印的内容: Product [id=null, name=bucket, description=red bucket, parent=null, children=null] Hibernate: insert into产品(DESCRIPTION、NAME、PARENT_PRODUCT_ID)值(?、?、?)
    • @PedroGrandi 现在看来我们解决了标题中所述的 json 反序列化问题。所以你应该接受这个答案:)
    猜你喜欢
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2021-01-12
    • 2018-06-22
    相关资源
    最近更新 更多