[英]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.