当前位置: 首页 > 知识库问答 >
问题:

如何使用Jackson在Spring Boot Application中自动解析JSON

越心水
2023-03-14

我有一个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..
}

当我使用实体管理器.持久化(集合),我json_schema列为空

我该如何解决?问题出在 setJsonSchema() 中

更新:

public String getJsonSchema() {
        return jsonSchema;
    }

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

这样的getter/setter不能解决问题

共有3个答案

米承嗣
2023-03-14

无需将逻辑放入实体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();
干茂才
2023-03-14

如本文所述,您不必手动创建自定义Hibernate Type,因为您可以使用以下依赖项通过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;
锺离烈
2023-03-14

您可以将JsonNode json属性定义为@Transient,这样JPA就不会尝试将其存储在数据库中。然而,杰克逊应该能够把它前后翻译给杰森。

然后可以为JPA编写getter/setter代码,这样就可以前后转换JsonNode到String。您定义了一个gettergetJsonString,它将JsonNode json>转换为 。这一个可以映射到一个表列,如“json_string”,然后定义一个setter,在这里您可以从JPA接收 string,并将其解析到可供jackson使用的JsonNode。

不要忘记将< code>@JsonIgnore添加到< code>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();
    }
  }
}
 类似资料:
  • 我在通过邮递员传递json数据时遇到问题。如果Mandetory日期带有注释,没问题。另一个日期接受null。但是在更新时,该日期会产生问题。我使用Java1.8与Spring启动 以下链接我已经访问过,但不适合这个。杰克逊JSON解析错误的LocalDateTime解析:无法构造java.time.LocalDate的实例:没有String参数构造函数/工厂方法从String值反序列化https

  • 问题内容: 我有一个Spring MVC Servlet,我需要从JavaScript前端Web应用程序接受JSON。要解析JSON,我需要使用Jackson。我需要获取JSON中的值并将它们按在JSON中出现的顺序存储到列表中。我尝试过将JsonFactory与JsonParser和JsonNode对象一起使用,但是可以使其正常工作。我也尝试过打开BufferedReader并逐行遍历请求正文,

  • 我正在学习SpringBoot,在参考文档中有一个例子,我有一个问题。文件的以下部分提到 6.使用@SpringBootApplication注释 可以使用单个@SpringBootApplication注释来启用这三个功能,即: @EnableAutoConfiguration:启用Spring Boot的自动配置机制 @ComponentScan:在应用程序所在的包上启用@Component扫

  • 我正在使用来解析Json数据。我的Json数据如下: GsonParse.java 我使用以下方法来解析此JSON数据。 我面对以下错误。

  • 18. 使用@SpringBootApplication注解 许多Spring Boot开发者总是使用@Configuration、@EnableAutoConfiguration和@ComponentScan来注解他们的主类。由于这些注解经常地被一起使用(特别是当您遵循上述的最佳实践),所以Spring Boot提供了一个方便的替代注解@SpringBootApplication。 @Sprin

  • 许多Spring Boot开发人员喜欢他们的应用程序使用自动配置,组件扫描,并能够在他们的“应用程序类”上定义额外的配置。 单个@SpringBootApplication注释可用于启用这三个功能,即: @EnableAutoConfiguration: 启用Spring Boot的自动配置机制 @ComponentScan: 在应用程序所在的包上启用@Component扫描(请参阅最佳实践) @