Jackson:使用更改名称来实例化JSON对象中的Java对象列表?

时间:2015-06-30 21:41:16

标签: java json jackson

我正在尝试使用Jackson将JSON blob转换为实例化的Java类对象列表。只要JSON保持不变,这就相当直接。但是,从服务器返回的每个JSON对象都以唯一的UUID开头,这意味着每个对象都是不同的。它是这样的:

{
    "863090b2-3d29-4829-9e01-5b03a6d5df04": {
        "name": "datasource 1",
        "dataSourceId": "863090b2-3d29-4829-9e01-5b03a6d5df04",
        "lastmodified": "2015-06-30T14:53:12"
    },
    "40de3a9e-e436-41b1-a37d-8c1d548293bc": {
        "name": "datasource 2",
        "dataSourceId": "40de3a9e-e436-41b1-a37d-8c1d548293bc",
        "lastmodified": "2015-06-30T14:52:46"
    },
    "f042db5f-455d-4edb-b8b5-610767735e64": {
        "name": "datasource 3",
        "dataSourceId": "f042db5f-455d-4edb-b8b5-610767735e64",
        "lastmodified": "2015-06-30T14:53:05"
    },
    "cd6323aa-ec27-4793-bb16-60729a556b97": {
        "name": "datasource 4",
        "dataSourceId": "cd6323aa-ec27-4793-bb16-60729a556b97",
        "lastmodified": "2015-06-30T14:52:55"
    }
}

请注意,每个JSON对象都以不同的名称开头。如果要使用相同的名称(例如" data")而不是使用UUID来启动每个JSON对象,那么这将是一个小步骤。现在我得到以下异常:

  

java.lang.RuntimeException:com.fasterxml.jackson.databind.JsonMappingException:无法从START_OBJECT标记中反序列化java.util.ArrayList的实例       在[来源:[B @ 20e6c4dc; line:1,column:1]       

这是我获得例外的代码段:

public List<Schema> getAllSchemas(String clientToken) {
    String endpoint = ALL_SCHEMAS_ROUTE + clientToken;
    byte[] responseBodyBytes = makeHttpRequest(endpoint, HttpMethod.GET, null).getBytes();
    List<Schema> allSchemas = null;
    try {
        allSchemas = objectMapper.readValue(responseBodyBytes,
                                            new TypeReference<List<Schema>>(){});
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    return allSchemas;
}

请注意,杰克逊将对仅包含其中一个对象的blob进行分解,但不会对整个列表进行分类。

我的局限是这些:

  • 我必须使用杰克逊,因为这是整个系统其他部分的用途。
  • 我无法改变服务器将JSON发回给我的方式。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

我能想到的最有希望的方法是将整个事件反序列化为Map<String, Schema>,因此这些ID不再被视为字段。