返回 JSON 作为响应 Spring 启动
Returning JSON as Response Spring Boot
我正在尝试以 json 的形式获取其余响应,而不是以字符串形式获取。
控制器
@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 响应:
@RequestMapping(value = "/getsome", method = RequestMethod.GET, produces = "application/json"
并将 getData 字符串包装为响应
public class StringResponse {
private String response;
public StringResponse(String s) {
this.response = s;
}
}
@RequestMapping(value = "/getsome", method = RequestMethod.POST, consumes =
"application/json;")
public @ResponseBody
ModelAndView getSome(@RequestBody List<Map<String, String>> request) {
request.stream().forEach(mapsData->{
mapsData.entrySet().forEach(mapData -> {
System.Out.Println("key :"+mapData.getKey() + " " +
" value : " +mapData.getValue());
});
}
});
return new ModelAndView("redirect:/home");
}
像这样改变你的一些模型class
@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
@Column(name = "t_col", columnDefinition = "json")
@Convert(attributeName = "data", converter = JsonConverter.class)
private Map<String, Object> json = new HashMap<>();
//constructors
//getters and setters
}
写一个json转换器class。
@Converter
public class JsonConverter
implements AttributeConverter<String, Map<String, Object>>
{
@Override
public Map<String, Object> convertToDatabaseColumn(String attribute)
{
if (attribute == null) {
return new HashMap<>();
}
try
{
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.readValue(attribute, HashMap.class);
}
catch (IOException e) {
}
return new HashMap<>();
}
@Override
public String convertToEntityAttribute(Map<String, Object> dbData)
{
try
{
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.writeValueAsString(dbData);
}
catch (JsonProcessingException e)
{
return null;
}
}
}
它将数据库 json 属性转换为您想要的结果。谢谢
您需要将 json 属性定义为 JsonNode 以便 jackson 可以来回读取它,但标记为 @Transient
因此 JPA 不会尝试将其存储在数据库中。
然后您可以为 JPA 编写 getter/setter 代码,在 JPA 中来回转换 JsonNode 和 String。您定义一个 getter getJsonString
将 JsonNode json
转换为 String
。那个可以映射到一个 table 列,比如 '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 必须用 [=18= 标记].
将您的数据库答案从 findAll
转换为对象类型列表,例如(某种类型的列表),然后是 return 数据。这将解决您的问题。
我正在尝试以 json 的形式获取其余响应,而不是以字符串形式获取。
控制器
@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 响应:
@RequestMapping(value = "/getsome", method = RequestMethod.GET, produces = "application/json"
并将 getData 字符串包装为响应
public class StringResponse {
private String response;
public StringResponse(String s) {
this.response = s;
}
}
@RequestMapping(value = "/getsome", method = RequestMethod.POST, consumes =
"application/json;")
public @ResponseBody
ModelAndView getSome(@RequestBody List<Map<String, String>> request) {
request.stream().forEach(mapsData->{
mapsData.entrySet().forEach(mapData -> {
System.Out.Println("key :"+mapData.getKey() + " " +
" value : " +mapData.getValue());
});
}
});
return new ModelAndView("redirect:/home");
}
像这样改变你的一些模型class
@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
@Column(name = "t_col", columnDefinition = "json")
@Convert(attributeName = "data", converter = JsonConverter.class)
private Map<String, Object> json = new HashMap<>();
//constructors
//getters and setters
}
写一个json转换器class。
@Converter
public class JsonConverter
implements AttributeConverter<String, Map<String, Object>>
{
@Override
public Map<String, Object> convertToDatabaseColumn(String attribute)
{
if (attribute == null) {
return new HashMap<>();
}
try
{
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.readValue(attribute, HashMap.class);
}
catch (IOException e) {
}
return new HashMap<>();
}
@Override
public String convertToEntityAttribute(Map<String, Object> dbData)
{
try
{
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.writeValueAsString(dbData);
}
catch (JsonProcessingException e)
{
return null;
}
}
}
它将数据库 json 属性转换为您想要的结果。谢谢
您需要将 json 属性定义为 JsonNode 以便 jackson 可以来回读取它,但标记为 @Transient
因此 JPA 不会尝试将其存储在数据库中。
然后您可以为 JPA 编写 getter/setter 代码,在 JPA 中来回转换 JsonNode 和 String。您定义一个 getter getJsonString
将 JsonNode json
转换为 String
。那个可以映射到一个 table 列,比如 '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 必须用 [=18= 标记].
将您的数据库答案从 findAll
转换为对象类型列表,例如(某种类型的列表),然后是 return 数据。这将解决您的问题。