使用 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);
}