我正在尝试将JSON对象的字符串表示解析为映射列表。 json对象的结构类似于以下内容:
[
{
"first_name": "fname1",
"last_name": "lname1"
},
{
"first_name": "fname2",
"last_name": "lname2"
}
.
.
.
]
唯一知道的是字符串值(例如“first_name”,“last_name”)仅在运行时,因此我无法创建任何预定义的类(如通常在fromJson()方法中使用的)。
我试图创建以下功能(在我看到一些在线示例之后)并且它不起作用:
public List<Map<String, Object>> fromJson(String jsonAsString) {
final JsonElement jsonElement = this.jsonParser.parse(jsonAsString);
List<Map<String, Object>> myList= new ArrayList<Map<String, Object>>();
Type listType = TypeToken.get(myList.getClass()).getType();
myList= (new Gson()).fromJson(jsonElement, listType);
return myList;
}
这个函数的结果是一个列表(在上面的例子中长度== 2)但是没有2个地图我得到2个对象。
有任何帮助吗? 谢谢!
答案 0 :(得分:2)
我不太明白你对TypeToken
的使用。
TypeToken
的要点是通过创建匿名类来捕获参数化类型(例如List<...>
),该类使用以下语法扩展由要捕获的类型参数化的泛型超类型:
new TypeToken<... type you want to capture ...>() {}.getType()
在您的情况下,应按如下方式使用:
myList = new Gson().fromJson(jsonAsString,
new TypeToken<List<Map<String, Object>>>() {}.getType());
答案 1 :(得分:0)
您不能使用这样的泛型,在运行时List<Map<String, Object>> myList
与List<Object> myList
相同。
您可以尝试使用地图数组
Gson gson = new Gson();
Map[] x = new Map[0];
Map[] fromJson = gson.fromJson("[\r\n" +
" { \r\n" +
" \"first_name\": \"fname1\",\r\n" +
" \"last_name\": \"lname1\"\r\n" +
" },\r\n" +
" {\r\n" +
" \"first_name\": \"fname2\",\r\n" +
" \"last_name\": \"lname2\"\r\n" +
" }]",x.getClass());