Java 如何使用Jackson自动解析Spring Boot应用程序中的JSON

Java 如何使用Jackson自动解析Spring Boot应用程序中的JSON,java,json,spring,jpa,jackson,Java,Json,Spring,Jpa,Jackson,我有一个json文件,里面有json对象作为属性值: { "name": "name", "json": {...} } 我需要在RestController中自动获取它,并在JPA+Hibernate中将它用作实体 我的实体是: 更新->更多指定实体 @Entity @Table(name = "collections") public class Collection { @Id private String name; @Column(name = "cac

我有一个json文件,里面有json对象作为属性值:

{
 "name": "name",
 "json": {...}
}
我需要在RestController中自动获取它,并在JPA+Hibernate中将它用作实体

我的实体是:

更新->更多指定实体

@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_模式
列设置为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转换为前后字符串。您可以定义一个getter
getJsonString
,它将
JsonNode json
转换为
String
。这个可以映射到一个表列,比如“json_string”,然后定义一个setter,从JPA接收
字符串
,并将其解析到JsonNode,该节点将可供jackson使用

不要忘记将
@JsonIgnore
添加到
getJsonString
中,这样Jackson就不会尝试将jsonString转换为json

@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();
    }
  }
}

创建响应,而无需将逻辑放入实体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();
如中所述,您不必手动创建自定义Hibernate类型,因为您只需使用以下依赖项通过Maven Central获取它:

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>${hibernate-types.version}</version> 
</dependency> 
实体映射将如下所示:

@Type(type = "json-node")
@Column(columnDefinition = "json")
private JsonNode json;

“json字段将为空”是什么意思?您的控制器看起来像
Cat getCat(int name){return cats.getCatByName(name);}
并且它返回
JSON
对象,其中
name
JSON
属性为空?这有点奇怪,但是JSON.asText()不起作用。json.toString()工作当我使用JPA时,这个@JsonIgnore列为空。您可以调试并查看get/setJsonString上的json值吗?get/setJsonString工作正常。在使用entityManager.persist(cat)之后,我在数据库中有空值,我可以删除@Column(name=“json_string”)——结果是一样的
@Type(type = "json-node")
@Column(columnDefinition = "json")
private JsonNode json;