将JsonObject解析为List <map <string,object =“”>&gt;使用Gson?</map <string,>

时间:2012-12-03 15:23:44

标签: java gson

我正在尝试将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个对象。

有任何帮助吗? 谢谢!

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>> myListList<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());