繁体   English   中英

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

[英]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。 您定义一个getJsonStringJsonNode 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM