[英]How to parse JSON in Spring Boot Application automatically using Jackson
我有一个带有 json 对象的json 文件作为里面的属性值:
{
"name": "name",
"json": {...}
}
我需要在RestController 中自动获取它并将其用作JPA+Hibernate 中的实体。
我的实体是:
UPDATE -> 更指定的实体
@Entity
@Table(name = "collections")
public class Collection {
@Id
private String name;
@Column(name = "cache_limit")
private int limit;
@Column(name = "cache_algorithm")
private String algorithm;
@Transient
private JsonNode schema;
@JsonIgnore
@Column(name ="json_schema")
private String jsonSchema;
public Collection() {
}
public String getJsonSchema() {
return schema.toString();
}
public void setJsonSchema(String jsonSchema) {
ObjectMapper mapper = new ObjectMapper();
try {
schema = mapper.readTree(jsonSchema);
} catch (IOException e) {
throw new RuntimeException("Parsing error -> String to JsonNode");
}
}
..setters and getters for name limit algorithm schema..
}
当我使用entityManager.persist(Collection)
我有json_schema
列为NULL
我该如何解决? 问题可能出在setJsonSchema() 中
更新:
public String getJsonSchema() {
return jsonSchema;
}
public void setJsonSchema(JsonNode schema) {
this.jsonSchema = schema.toString();
}
这样的 getter/setter 不能解决问题
您可以将JsonNode json
属性定义为@Transient
这样 JPA 就不会尝试将其存储在数据库中。 但是,jackson 应该能够将它来回转换为 Json。
然后,您可以为 JPA 编写 getter/setter 代码,这样您就可以从 JsonNode 来回转换为 String。 您定义一个getJsonString
将JsonNode json
转换为String
。 该列可以映射到表列,例如“json_string”,然后您定义一个 setter,您可以在其中接收来自 JPA 的String
并将其解析为 JsonNode,以便 jackson 使用。
不要忘记将@JsonIgnore
添加到getJsonString
以便 Jackson 不会尝试将 json 转换为 jsonString。
@Entity
@Table(name = "cats")
public class Cat {
private Long id;
private String name;
@Transient
private JsonNode json;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
@Column(name ="name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setId(Long id) {
this.id = id;
}
// Getter and setter for name
@Transient
public JsonNode getJson() {
return json;
}
public void setJson(JsonNode json) {
this.json = json;
}
@Column(name ="jsonString")
public String getJsonString() {
return this.json.toString();
}
public void setJsonString(String jsonString) {
// parse from String to JsonNode object
ObjectMapper mapper = new ObjectMapper();
try {
this.json = mapper.readTree(jsonString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
如本文所述,您无需手动创建自定义 Hibernate 类型,因为您可以使用以下依赖项通过 Maven Central 轻松获取它:
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>${hibernate-types.version}</version>
</dependency>
有关更多信息,请查看Hibernate Types开源项目。
然后你可以简单地声明你类的新类型。
@TypeDef(
name = "jsonb-node",
typeClass = JsonNodeBinaryType.class
)
实体映射将如下所示:
@Type(type = "json-node")
@Column(columnDefinition = "json")
private JsonNode json;
创建响应,无需将逻辑放入实体 setter/getter,无需第三方依赖:
ObjectNode node = JsonNodeFactory.instance.objectNode();
node.put("name", cat.getName());
node.set("json", new ObjectMapper().readTree(cat.getJson()));
return Response.ok(node).build();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.