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

Controller

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

  @Autowired
  private SomeService someService;

  @GetMapping("/getsome")
  public Iterable<SomeModel> getData(){
    return someService.getData();
  }
}

服务
@Autowired
private SomeRepo someRepo;

public Iterable<someModel> getData(){
  return someRepo.findAll();
}

存储库
public interface SomeRepo extends CrudRepository<SomeModel,Integer>{

}

模型
@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
}

当我运行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" }]}"
  }
]

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

对于数据库,三列是int,varchar和varchar。

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

最佳答案

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

然后,您可以为JPA编写getter/setter程序,在其中将JsonNode转换为String来回转发。您可以定义将getJsonString转换为JsonNode json的 setter/getter String。可以将其映射到表列(例如“json_string”),然后定义一个 setter ,从JPA接收String并将其解析为JsonNode( jackson 可用),然后 jackson 将其转换为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();
    }
  }
}

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

关于spring - 返回JSON作为响应Spring Boot,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55014408/

10-14 11:42