我正在尝试以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/