[英]Parsing JsonObject to List<Map<String, Object>> using Gson?
I'm trying to parse a string representation of a JSON object into a List of maps.我正在尝试将 JSON 对象的字符串表示形式解析为地图列表。 The json object will be structured something like the following: json 对象的结构如下:
[
{
"first_name": "fname1",
"last_name": "lname1"
},
{
"first_name": "fname2",
"last_name": "lname2"
}
.
.
.
]
The only thing that is known is the strings values (eg "first_name", "last_name") on runtime only , therefore I cannot create any predefined classes (like usually used in fromJson() method).唯一已知的是仅运行时的字符串值(例如“first_name”、“last_name”),因此我无法创建任何预定义的类(例如通常在 fromJson() 方法中使用)。
I have tried to create the following function (after I saw some examples online) and it didn't work:我尝试创建以下函数(在我在网上看到一些示例之后)但它不起作用:
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;
}
The result of this function is a list (length == 2 in the above case) but instead of 2 maps i'm getting 2 Objects.这个函数的结果是一个列表(在上面的例子中长度 == 2)但是我得到的是 2 个对象而不是 2 个映射。
Any help?有什么帮助吗? Thanks!谢谢!
I don't quite understand your use of TypeToken
.我不太明白您对TypeToken
的使用。
The point of TypeToken
is to capture parameterized type (such as List<...>
) by creating anonymous class that extends generic supertype parameterized by the type you want to capture, using the following syntax: TypeToken
是通过创建匿名类来捕获参数化类型(例如List<...>
),该类扩展由您要捕获的类型参数化的泛型超类型,使用以下语法:
new TypeToken<... type you want to capture ...>() {}.getType()
In your case it should be used as follows:在您的情况下,应按如下方式使用它:
myList = new Gson().fromJson(jsonAsString,
new TypeToken<List<Map<String, Object>>>() {}.getType());
You cannot use generics like that, at runtime List<Map<String, Object>> myList
is the same as List<Object> myList
.您不能使用这样的泛型,在运行时List<Map<String, Object>> myList
与List<Object> myList
。
You can try with an array of maps您可以尝试使用一系列地图
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());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.