我想使用以下JSON和pojo将字符串的2D数组反序列化为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的有问题部分以进行反序列化。
我得到了完全相同的错误。
有谁知道为什么会出现此错误或如何解决问题?
答案 0 :(得分:2)
我不确定为什么会抛出异常。正如您所说 - 反向操作产生完全相同的JSON。
然而,我确实有一个解决方案,它有点笨拙,但会让你前进。
我的解决方法是将String[][]
类型替换为Object
。
private Command command;
private String table;
private String[] columns;
private Object values; // was String[][]
运行反序列化代码,您将看到Jackson库代表类型为List<List<String>>
的2D数组。因此,所需要的只是演员表,然后您可以访问所有元素。
List<List<String>> values = (List<List<String>>) object.getValues();
我确实尝试使用List<List<String>>
直接替换目标对象中的String[][]
,但这引发了类似的异常。
答案 1 :(得分:-1)
使用下面的代码转换2D字符串数组:
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);
}