WS 的响应是首字母大写的 json。我正在尝试将响应封装在一个具有小写首字母的新 MyResponse obj 中。
我正在使用杰克逊。
起初我有我的模型:
Uncaught TypeError: Error resolving module specifier “pixi.js”. Relative module specifiers must start with “./”, “../” or “/”.
如上所示,我在 public class Telephone {
private String country;
private String prefix;
//getters and setters
}
public class Position {
private String x;
private String y;
//getters and setters
}
public class Root {
@JsonProperty("Telephone")
private List<Telephone> telephone;
@JsonProperty("Position")
private List<Position> position;
//getters and setters
}
public class MyResponse {
private final Root root;
private final String now;
public MyResponse(Root root, String now) {
this.root = root;
this.now = now;
}
//getters
}
类中使用了 @JsonProperty,因为我想使用第一个小写字母映射我的响应。
现在我有了 RestController:
Root
正如您在上面的代码片段中看到的,一开始我得到了 json 字符串(在我调用 WS 的真实代码中),然后我使用 @Controller
public class RestController {
@GetMapping("/my-controller")
ResponseEntity<String> myController() {
//Simulating the request to my ws to get my json string
String jsonString = "{\n" +
" \"Telephone\":[\n" +
" {\n" +
" \"country\":\"ES\",\n" +
" \"prefix\":\"+34\"\n" +
" },\n" +
" {\n" +
" \"country\":\"FR\",\n" +
" \"prefix\":\"+33\"\n" +
" },\n" +
" {\n" +
" \"country\":\"EN\",\n" +
" \"prefix\":\"+44\"\n" +
" }\n" +
" ],\n" +
" \"Position\":[\n" +
" {\n" +
" \"x\":\"123.23\",\n" +
" \"y\":\"98.93\"\n" +
" },\n" +
" {\n" +
" \"x\":\"250.99\",\n" +
" \"y\":\"43.89\"\n" +
" }\n" +
" ]\n" +
"}";
ObjectMapper om = new ObjectMapper();
Root root = null;
try {
root = om.readValue(jsonString, Root.class);
MyResponse myResponse = new MyResponse(root, LocalDateTime.now().toString());
String responseAsString = om.writeValueAsString(myResponse);
return new ResponseEntity<>(responseAsString, HttpStatus.OK);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
方法将它反序列化为 Java POJO:>
readValue
然后我使用反序列化的 POJO 创建了我的 MyResponse 对象:
root = om.readValue(jsonString, Root.class);
最后,我使用 MyResponse myResponse = new MyResponse(root, LocalDateTime.now().toString());
将 myResponse obj 序列化为 String 并将其返回到我的前端:
om.writeValueAsString
由于 MyResponse obj 使用我的 Root @JsonProperty (s) 被序列化和反序列化 我得到:
String responseAsString = om.writeValueAsString(myResponse);
return new ResponseEntity<>(responseAsString, HttpStatus.OK);
这不是我想要做的:我的回复中有大写字母。 我怎么解决这个问题?我应该使用两个不同的类进行序列化和反序列化吗?
答案 0 :(得分:0)
您也可以在 getter 和 setter 上指定您的 Jackson 注释,让它们的行为有所不同。像这样:
watch(async () => {
await map.value.circles.forEach((item, i) => console.log(toRaw(item.Circle), i))
}, { deep: true })
答案 1 :(得分:0)
我已经尝试了 Felix 的建议。但它不起作用,我收到以下错误:
Conflicting/ambiguous property name definitions found multiple explicit names: but also implicit accessor
一段时间后,我能够以这种方式解决我的问题:
public class Root {
private List<Telephone> telephone;
private List<Position> position;
@JsonCreator
public Root(@JsonProperty("Telephone") List<Telephone> telephon, @JsonProperty("Position") List<Position> position) {
this.telephon = telephon;
this.position = position;
}
//getters and setters
}
注解 @JsonCreator
仅用于反序列化阶段。
当反序列化 Jackson 时,使用带有 @JsonCreator
注释的构造函数。在序列化阶段,Jackson 使用字段名称将 obj 转换为 String。