Как автоматически анализировать JSON в Spring Boot Application с помощью Jackson - PullRequest
0 голосов
/ 04 марта 2019

У меня есть файл 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_schema как NULL

Как я могу ее решить? Проблема в setJsonSchema () возможно

update :

public String getJsonSchema() {
        return jsonSchema;
    }

    public void setJsonSchema(JsonNode schema) {
        this.jsonSchema = schema.toString();
    }

Такие геттеры / сеттеры не решают проблему

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Создание ответа без помещения логики в установщик / получение объекта, без сторонних зависимостей:

ObjectNode node = JsonNodeFactory.instance.objectNode();
node.put("name", cat.getName());
node.set("json", new ObjectMapper().readTree(cat.getJson()));
return Response.ok(node).build();
0 голосов
/ 04 марта 2019

Вы можете попробовать это Как хранить данные EAV (Entity-Attribute-Value) без схемы, используя JSON и 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;
0 голосов
/ 04 марта 2019

Вы можете определить JsonNode json свойство как @Transient, поэтому JPA не пытается сохранить его в базе данных.Тем не менее, Джексон должен быть в состоянии перевести его назад и вперед в Json.

Тогда вы можете кодировать getter / setter для JPA, так что вы переводите из JsonNode в String назад и вперед.Вы определяете геттер getJsonString, который переводит JsonNode json в String.Это можно сопоставить со столбцом таблицы, например «json_string», затем вы определяете установщик, где вы получаете String от JPA и анализируете его в JsonNode, который будет доступен для Джексона.

Не забывайтедобавить @JsonIgnore к getJsonString, чтобы Джексон не пытался перевести на 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();
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...