使用Java / Jackson库从JSON反序列化2D数组会引发异常

时间:2017-09-06 14:07:05

标签: java arrays json jackson json-deserialization

我想使用以下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的有问题部分以进行反序列化。

我得到了完全相同的错误。

有谁知道为什么会出现此错误或如何解决问题?

2 个答案:

答案 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);
}