在序列化和反序列化 Jackson 中使用小写字母的响应

时间:2021-06-24 09:51:59

标签: java json jackson jackson-databind

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);

这不是我想要做的:我的回复中有大写字母。 我怎么解决这个问题?我应该使用两个不同的类进行序列化和反序列化吗?

2 个答案:

答案 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。