使用JsonArray和JsonObject读取Json时出现Gson异常

时间:2011-09-08 12:23:17

标签: java android web-services json gson

我正在尝试使用Gson调用json响应。但它在一个地方包含一个JSONArray对象,在同一个层次结构中包含一个JSONObject,这里我的json响应是:

"{"SERVICES":{"Results":[{"Items":{"Item":[{"@Id":"10"},{"@Id":"12"}]}}, 
  {"Items":{"Item":{"@Id":"13"}}}]}}"

在结构中,它在这个层次结构中,

    {"SERVICES":
        {"Results":
            [
             {"Items":
                {"Item":
                    [
                     {"@Id":"10"},
                     {"@Id":"12"}
                    ]
                }
             },
             {"Items":
                {"Item":
                    {"@Id":"13"}
                }
             }
             ]
        }
    }

这里第一个'Item'元素包含一个数组,第二个元素是一个对象。以下是我的代码,

import java.util.Iterator;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;

public class Next { 
public static void main(String args[]){

    String jsonData = Services.getJsonData();   //{"SERVICES":{"Results":[{"Items":{"Item":[{"@Id":"10"},{"@Id":"12"}]}}, {"Items":{"Item":{"@Id":"13"}}}]}}    

    TResponseInfo responseInfo = new Gson().fromJson(jsonData, TResponseInfo.class);        
    }

class TResponseInfo{
    TServicesInfo SERVICES;
}

class TServicesInfo {
    List<TResultsInfo> Results;
}

class TResultsInfo {
    TItemsInfo Items;
}

class TItemsInfo {
    List<TItemInfo> Item;
    //TItemInfo Item;
}

class TItemInfo {
    @SerializedName("@Id")
    int Id;
}

我在这里得到例外:

  

无法反序列化json对象{“@Id”:“13”}给定类型java.util.List

和消息:这不是JSON数组。

1 个答案:

答案 0 :(得分:0)

更新:您的Json似乎错了,您的Item:是一个数组,但JSON中的秒字段是一个对象。

首先你有:

"Item":
                [
                 {"@Id":"10"},
                 {"@Id":"12"}
                ]

然后你有:

"Item":
                {"@Id":"13"}

这应该是:

 "Item":
               [
                {"@Id":"13"}
               ]

用Gson管理泛型可能很难。我建议你改用数组。例如。像这样的东西:

class TResponseInfo{
    TServicesInfo SERVICES;
}

class TServicesInfo {
    TResultsInfo[] Results; // an array  instead of a generic List
}

class TResultsInfo {
    TItemsInfo Items;
}

class TItemsInfo {
    TItemInfo[] Item; // an array instead of a generic List
}