使用POJO对象类将JSON解析为POJO对象列表

时间:2018-10-30 14:51:26

标签: java json groovy gson

我被迫使用无法更改签名的接口方法:

List parse(String path, Class clazz)

应该返回带有在clazz参数中传递的类型的对象列表,例如:

List<TagsRun> runs = reader.parse(path, TagsRun.class)

我需要实现一个JSON解析器,问题是如何将clazz参数的类型设置为结果列表?

我使用Gson,可能类似于:

List parse(String path, Class clazz) {
    Type collectionType = new TypeToken<List<TagsRun>>(){}.getType();
    List<TagsRun> myList = new Gson.fromJson(json, collectionType);
    return myList 
}

但是如何在此处用 List 替换特定的 List

我所做的唯一可行的解​​决方案是更改方法签名:

<T> List<T> parse(String path, Class<T[]> clazz ) {
        T[] arr = new Gson().fromJson(new File(path).text(), clazz);
        return Arrays.asList(arr);
}

换句话说,如何使用签名返回与clazz参数类型相同的对象的列表:

 List parse(String path, Class clazz)

谢谢。

3 个答案:

答案 0 :(得分:1)

由于您无法更改方法的签名,因此返回带有类型参数的List毫无意义。

public List foo() {
    ArrayList<String> strings = new ArrayList<>();
    return strings;
}

public void methodUsingFoo() {
    // possible but you should check if the assumption is correct:
    List<String> uncheckedAssignment = foo(); // so don't do this

    // this is what foo *will* return:
    List actualResult = foo();
}

相反,您可以执行以下操作:

public void methodUsingParse() {
    Class clazz = Object.class; // or whatever class you want or need

    // this is what your method *will* return:
    List actualResult = parse("/path/to/somewhere", clazz);

    // best way would be to check each element:
    for(Object element : actualResult) {
        if (clazz.equals(element.getClass())) {
            // do your stuff here
        }
    }
}

我忘记了什么: 我不认为有可能像您想的那样做。

答案 1 :(得分:0)

也许可以转换列表?

List<TagsRun> myList = new Gson.fromJson(json, collectionType);
List<Clazz> = Arrays.asList(myList.toArray(new Clazz[0]));

编辑: 我认为这可以为您提供帮助:https://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#checkedCollection(java.util.Collection,%20java.lang.Class)-如果您没有注意到,请向下滚动至“列表”部分

答案 2 :(得分:0)

终于解决了:

@Override
List parse(String path, Class clazz) {
    List result = []
    JsonArray jsonArray = new JsonParser()
            .parse(new File(path).getText(CHARSET))
            .getAsJsonArray()

    Gson gson = new Gson()
    jsonArray.each {
        result.add(gson.fromJson(it, clazz))
    }
    return result
}

诀窍是先获取一个数组,然后对每个数组项使用gson.fromJson(it, clazz)。这会将数组中的每个json元素转换为POJO,然后将其添加到结果列表中。