使用 Java/Jackson 库从 JSON 反序列化二维数组会抛出异常
Deserialising 2D Array from JSON using Java/Jackson libraries throws exception
我想使用以下 JSON 和 pojo 将二维字符串数组反序列化为 String[][]
字段。
Pojo 代码
public class DataProcess {
public enum Command {INSERT, UPDATE, DELETE}
private Command command;
private String table;
private String[] columns;
private String[][] values;
public String[] getColumns() {return columns;}
public void setColumns(String[] columns) {this.columns = columns;}
public String[][] getValues() {return values;}
public void setValues(String[][] values) {this.values = values;}
public Command getCommand() {return command;}
public void setCommand(Command command) {this.command = command;}
public String getTable() {return table;}
public void setTable(String table) {this.table = table;}
}
JSON 反序列化
...
"preTestData": [{
"columns": ["tracking_id"],
"values": [["AAAAAAA"]],
"command": "DELETE",
"table": "my_table"
}],
...
当我 运行 反序列化代码时,我得到以下异常
com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize
instance of java.lang.String[][] out of START_OBJECT token
at [Source: {
"name": "Basic create shipment request",
"preTestData": [{
"columns": ["tracking_id"],
"values": [["AAAAAAA"]],
"command": "DELETE",
"table": "my_table"
}],
为了进一步调查,我编写了反向序列化代码并打印出结果 JSON。
这是输出:
...
"preTestData": [{
"columns": ["tracking_id"],
"values": [["AAAAAAA"]],
"command": "DELETE",
"table": "my_table"
}],
...
看起来相同 - 但无论如何我将 JSON 输出粘贴到我的 JSON 的有问题的部分以进行反序列化。
我得到了完全相同的错误。
有谁知道为什么会出现此错误或如何解决此问题?
我不确定为什么会抛出异常。正如您所说 - 反向操作产生完全相同的 JSON.
不过,我确实有一个变通解决方案,虽然有点笨拙,但可以帮助您继续前进。
我的解决方法是将 String[][]
类型替换为 Object
。
private Command command;
private String table;
private String[] columns;
private Object values; // was String[][]
运行 您的反序列化代码,您将看到 Jackson 库表示类型为 List<List<String>>
的二维数组。所以只需要一个演员表,然后您就可以访问所有元素。
List<List<String>> values = (List<List<String>>) object.getValues();
我确实尝试使用 List<List<String>>
直接替换目标对象中的 String[][]
,但抛出了类似的异常。
使用下面的代码转换二维字符串数组:
ObjectMapper mapper = new ObjectMapper();
String[][] asArray = mapper.readValue(jsonString, String[][].class);
但对于你的问题,杰克逊做所有事情都毫不费力,没有任何问题:
public static void main(String[] args) throws IOException {
String json = "[{\"columns\": [\"tracking_id\"]," +
"\"values\": [[\"AAAAAAA\"]],\n" +
"\"command\": \"DELETE\",\n" +
"\"table\": \"my_table\"\n" +
"}],";
ObjectMapper mapper = new ObjectMapper();
DataProcess[] dataProcess = mapper.readValue(json, DataProcess[].class);
System.out.println("asArray = " + dataProcess);
}
我想使用以下 JSON 和 pojo 将二维字符串数组反序列化为 String[][]
字段。
Pojo 代码
public class DataProcess {
public enum Command {INSERT, UPDATE, DELETE}
private Command command;
private String table;
private String[] columns;
private String[][] values;
public String[] getColumns() {return columns;}
public void setColumns(String[] columns) {this.columns = columns;}
public String[][] getValues() {return values;}
public void setValues(String[][] values) {this.values = values;}
public Command getCommand() {return command;}
public void setCommand(Command command) {this.command = command;}
public String getTable() {return table;}
public void setTable(String table) {this.table = table;}
}
JSON 反序列化
...
"preTestData": [{
"columns": ["tracking_id"],
"values": [["AAAAAAA"]],
"command": "DELETE",
"table": "my_table"
}],
...
当我 运行 反序列化代码时,我得到以下异常
com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize
instance of java.lang.String[][] out of START_OBJECT token
at [Source: {
"name": "Basic create shipment request",
"preTestData": [{
"columns": ["tracking_id"],
"values": [["AAAAAAA"]],
"command": "DELETE",
"table": "my_table"
}],
为了进一步调查,我编写了反向序列化代码并打印出结果 JSON。
这是输出:
...
"preTestData": [{
"columns": ["tracking_id"],
"values": [["AAAAAAA"]],
"command": "DELETE",
"table": "my_table"
}],
...
看起来相同 - 但无论如何我将 JSON 输出粘贴到我的 JSON 的有问题的部分以进行反序列化。
我得到了完全相同的错误。
有谁知道为什么会出现此错误或如何解决此问题?
我不确定为什么会抛出异常。正如您所说 - 反向操作产生完全相同的 JSON.
不过,我确实有一个变通解决方案,虽然有点笨拙,但可以帮助您继续前进。
我的解决方法是将 String[][]
类型替换为 Object
。
private Command command;
private String table;
private String[] columns;
private Object values; // was String[][]
运行 您的反序列化代码,您将看到 Jackson 库表示类型为 List<List<String>>
的二维数组。所以只需要一个演员表,然后您就可以访问所有元素。
List<List<String>> values = (List<List<String>>) object.getValues();
我确实尝试使用 List<List<String>>
直接替换目标对象中的 String[][]
,但抛出了类似的异常。
使用下面的代码转换二维字符串数组:
ObjectMapper mapper = new ObjectMapper();
String[][] asArray = mapper.readValue(jsonString, String[][].class);
但对于你的问题,杰克逊做所有事情都毫不费力,没有任何问题:
public static void main(String[] args) throws IOException {
String json = "[{\"columns\": [\"tracking_id\"]," +
"\"values\": [[\"AAAAAAA\"]],\n" +
"\"command\": \"DELETE\",\n" +
"\"table\": \"my_table\"\n" +
"}],";
ObjectMapper mapper = new ObjectMapper();
DataProcess[] dataProcess = mapper.readValue(json, DataProcess[].class);
System.out.println("asArray = " + dataProcess);
}