簡體   English   中英

使用 POJO 對象類將 JSON 解析為 POJO 對象列表

[英]Parse JSON to list of POJO objects using POJO object class

我被迫使用帶有我無法更改的簽名的接口方法:

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< type of clazz >替換特定的List< TagsRun >

我所做的唯一可行的解​​決方案需要更改方法簽名:

<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)

提前致謝。

由於您無法更改方法的簽名,因此返回帶有類型參數的 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
        }
    }
}

我忘記了什么:我認為甚至不可能像你想的那樣做這件事。

也許轉換列表?

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) - 如果您沒有注意到,請向下滾動到列表部分

解決了,終於:

@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,然后將其添加到結果列表中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM