返回 JSON 作为 Spring Boot 响应

404*_*505 6 spring spring-data spring-data-jpa spring-data-rest spring-boot

我正在尝试以 json 形式获取休息响应,而不是以字符串形式获取。

控制器

@RestController
@RequestMapping("/api/")
public class someController{

  @Autowired
  private SomeService someService;

  @GetMapping("/getsome")
  public Iterable<SomeModel> getData(){
    return someService.getData();
  }
}
Run Code Online (Sandbox Code Playgroud)

服务

@Autowired
private SomeRepo someRepo;

public Iterable<someModel> getData(){
  return someRepo.findAll();
}
Run Code Online (Sandbox Code Playgroud)

存储库

public interface SomeRepo extends CrudRepository<SomeModel,Integer>{

}
Run Code Online (Sandbox Code Playgroud)

楷模

@Entity
@Table(name="some_table")
public class SomeModel{

  @Id
  @Column(name="p_col", nullable=false)
  private Integer id;
  @Column(name="s_col")
  private String name
  @Column(name="t_col")
  private String json;   // this column contains json data

  //constructors, getters and setters
}
Run Code Online (Sandbox Code Playgroud)

当我运行localhost:8080/api/getsome时我得到:

[
 {
    "p_col":1,
    "s_col":"someName",
    "t_col":" 
{\r\n\t"school_name\":\"someSchool\",\t\r\n\t"grade\":"A\",\r\n\t\"class\": 
 [{\"course\":"abc",\t"course_name\":\"def" }]}"
  }
]
Run Code Online (Sandbox Code Playgroud)

字段t_col返回字符串而不是 json。如何获取响应中的 json 对象?

对于数据库来说,三列分别是int、varchar、varchar。

任何帮助,将不胜感激。谢谢 !!

Cri*_*ado 2

您需要将 json 属性定义为 JsonNode,以便 jackson 可以来回读取它,但 mark 是这样,@Transient因此 JPA 不会尝试将其存储在数据库中。

然后,您可以为 JPA 编写 getter/setter 代码,在其中将 JsonNode 来回转换为 String。您定义一个getJsonString翻译JsonNode json为的 getter String。这个可以映射到表列,例如“json_string”,然后定义一个setter,您可以在其中接收String来自JPA的数据并将其解析为可供杰克逊使用的JsonNode,然后杰克逊会将其转换为json对象而不是字符串正如你提到的。

@Entity
@Table(name = "model")
public class SomeModel {

  private Long id;
  private String col1;

  //  Attribute for Jackson 
  @Transient
  private JsonNode json;

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  public Long getId() {
    return id;
  }

  @Column(name ="col1")
  public String getCol1() {
    return col1;
  }

  // Getter and setter for name

  @Transient
  public JsonNode getJson() {
    return json;
  }

  public void setJson(JsonNode json) {
    this.json = json;
  }

  // Getter and Setter for JPA use
  @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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

注意,@Column是在 getter 处定义的,因为我们需要指示要使用的 JPA getJsonString,而 JPA 要求一致性,因此所有列的 getter 必须用 标记@Columns