Java 使用Gson解析列表对象json

Java 使用Gson解析列表对象json,java,android,json,gson,Java,Android,Json,Gson,我试图用google Gson库解析Json,但目前我无法让它工作 这是我应该得到的Json: { "shoppingLists": [ { "ShoppingList": { "id": "51", "name": "loool", "created": "2014-03-22 13:03:22", "modified": "2014-03-22 13:03:22"

我试图用google Gson库解析Json,但目前我无法让它工作

这是我应该得到的Json:

{
"shoppingLists": [
    {
        "ShoppingList": {
            "id": "51",
            "name": "loool",
            "created": "2014-03-22 13:03:22",
            "modified": "2014-03-22 13:03:22"
        },
        "ShoppingItem": [
            {
                "id": "24",
                "shopping_item_category_id": "19",
                "name": "Biscuits",
                "description": "",
                "created": "2014-02-05 17:43:45",
                "modified": "2014-02-05 17:43:45",
                "category_name": "Confiseries \/ Gouters"
            },
            {
                "id": "25",
                "shopping_item_category_id": "19",
                "name": "Snickers",
                "description": "",
                "created": "2014-02-05 17:44:08",
                "modified": "2014-02-05 17:44:08",
                "category_name": "Confiseries \/ Gouters"
            },
            {
                "id": "26",
                "shopping_item_category_id": "19",
                "name": "C\u00e9reales",
                "description": "",
                "created": "2014-02-05 17:44:57",
                "modified": "2014-02-05 17:44:57",
                "category_name": "Confiseries \/ Gouters"
            }
        ]
    }
 ]
}
以下是我的模型:

购物清单:

public class shoppingLists {
        public ShoppingList ShoppingList;
        public List<ShoppingItem> ShoppingItems;
}
购物项目:

public class ShoppingItem {
public int id;
public int shopping_item_category_id;
public String name;
public String description;
public String created;
public String modified;
public String category_name;
}
以下是从服务器获取Json的AsyncTask:

public class APIRetrieveLists extends AsyncTask<APIRequestModel, Void, List<shoppingLists>>{

SQLHelper _sqlHelper = null;
Context _context;
ProgressBar _pb;

public APIRetrieveLists(Context context, ProgressBar pb){
    this._context = context;
    this._pb = pb;
}


@Override
protected void onPreExecute(){
}

@Override
protected void onPostExecute(List<shoppingLists> model){
    this._sqlHelper = new SQLHelper(this._context);
    if (model != null){
        for (shoppingLists cn : model){
            Log.i("infos", "list's name => " + cn.ShoppingList.name);
        }
    }else{
        Log.i("infos", "model is null");
    }
}

@Override
protected List<shoppingLists> doInBackground(APIRequestModel... arg0) {
    APIRequestModel model = arg0[0];
    try
    {
        try
        {
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("access_token", model.getToken()));
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://apiurl/index.json");
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8));
            HttpResponse response = httpclient.execute(httppost);
            BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            String s = "";
            String all = "";
            while ((s = reader.readLine()) != null){
                all += s;
            }
            Gson gson = new Gson();
            List<shoppingLists> Obj = (List<shoppingLists>) gson.fromJson(all, new TypeToken<List<shoppingLists>>(){}.getType());
            return (Obj);
        } 
        catch (ClientProtocolException e) {
            Log.i("infos", "first");
            return (null);
        } 
    }
    catch (Exception e){
        Log.i("infos", "second");
        return (null);
    }
}
}
公共类APIRetrieveLists扩展异步任务{
SQLHelper _SQLHelper=null;
语境(Context)语境;;
ProgressBar_pb;
公共APIRetrieveLists(上下文,ProgressBar pb){
这._context=context;
这个。_pb=pb;
}
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的void onPostExecute(列表模型){
this.\u sqlHelper=新的sqlHelper(this.\u上下文);
如果(型号!=null){
对于(购物清单cn:model){
Log.i(“infos”,“list's name=>”+cn.ShoppingList.name);
}
}否则{
Log.i(“infos”,“模型为空”);
}
}
@凌驾
受保护列表doInBackground(APIRestModel…arg0){
APIRequestModel=arg0[0];
尝试
{
尝试
{
List nameValuePairs=新的ArrayList();
添加(新的BasicNameValuePair(“访问令牌”,model.getToken());
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(“http://apiurl/index.json");
setEntity(新的UrlEncodedFormEntity(nameValuePairs,HTTP.UTF_8));
HttpResponse response=httpclient.execute(httppost);
BufferedReader=new BufferedReader(new InputStreamReader(response.getEntity().getContent());
字符串s=“”;
字符串全部=”;
而((s=reader.readLine())!=null){
全部+=s;
}
Gson Gson=新的Gson();
List Obj=(List)gson.fromJson(all,new-TypeToken(){}.getType());
返回(Obj);
} 
捕获(客户端协议例外e){
Log.i(“infos”、“first”);
返回(空);
} 
}
捕获(例外e){
Log.i(“infos”、“second”);
返回(空);
}
}
}
“第二个”例外总是触发。。。 Log.i(“infos”,“模型为空”);也会执行。 如果有人能帮忙:) 非常感谢。 问候


如果我的眼镜骗不了我的话,json中没有
购物清单
项目列表。如此变化:
List Obj=(List)gson.fromJson(all,new-TypeToken(){}.getType())

进入:

不会导致任何运行时gson异常。最终,您可以将单个解析的
obj
包装到
列表中,使其与当前代码匹配。例如:

shoppingLists obj = gson.fromJson(all, shoppingLists.class);
ArrayList<shoppingLists> result = new ArrayList<shoppingLists>();
result.add(obj);
return result;
shoppingLists obj=gson.fromJson(全部,shoppingLists.class);
ArrayList结果=新建ArrayList();
结果:添加(obj);
返回结果;

在ShoppingList中再添加一个包装器,因为jsonObject将ShoppingList作为键,将ShoppingListItem数组作为值。您还需要为ShoppingItems字段注释
@SerializedName
,因为它与Json中的键不匹配

找到下面更新的类和解析器

Gson gson = new Gson();
FinalClass myObj = gson.fromJson(jsonString, FinalClass.class);
班级

public class FinalClass {
    public ArrayList<ShoppingListItem> shoppingLists;
}

public class ShoppingListItem {
    public ShoppingList ShoppingList;
    @SerializedName("ShoppingItem")
    public List<ShoppingItem> ShoppingItems;
}

public class ShoppingList {
    public int id;
    public String name;
    public String created;
    public String modified;
}

public class ShoppingItem {
   public int id;
   public int shopping_item_category_id;
   public String name;
   public String description;
   public String created;
   public String modified;
   public String category_name;
}
公共类最终类{
公共ArrayList购物清单;
}
公共类ShoppingListItem{
公众购物清单;
@SerializedName(“ShoppingItem”)
公开购物物品清单;
}
公共类购物清单{
公共int id;
公共字符串名称;
创建公共字符串;
修改公共字符串;
}
公共类购物品{
公共int id;
公共int购物项目类别id;
公共字符串名称;
公共字符串描述;
创建公共字符串;
修改公共字符串;
公共字符串类别名称;
}

我最终可以得到几个ShoppingList,我将我的fromJson改为List Obj=(List)gson.fromJson(all,shoppinglist.class);但它仍然不起作用。。我还收到了一条警告,因为这个东西是
gson。fromJson
将解析
购物列表
。将其强制转换为列表将引发运行时异常。稍微更新一下答案。即使你说gunar,仍然会有一个例外,并且将obj添加到列表中也没问题,但是假设我在json中有几个购物列表,这就不再有效了,对吧?考虑到上面给出的json示例,我发布了我的答案。如果您在接收数组时遇到这种情况,那么情况就不同了。如果服务器更改了响应的数据类型,那么您就有麻烦了,因为您不知道如何解析响应。Uttam的答案看起来很有希望。仍然得到第二个异常,类名对解析器重要吗?@bottus你能粘贴得到的异常/Logcat吗?类名可以是任何内容。。但重要的是,对象/变量应该与JSON中的键匹配。这里有一个异常:com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:应该是BEGIN_对象,但在第1行列中是字符串6@bottus您能粘贴从web服务收到的完整Json响应吗?根据您在问题中提供的Json,我建议更改..我无法在eclipse中正确显示它。。。有什么建议吗?
Gson gson = new Gson();
FinalClass myObj = gson.fromJson(jsonString, FinalClass.class);
public class FinalClass {
    public ArrayList<ShoppingListItem> shoppingLists;
}

public class ShoppingListItem {
    public ShoppingList ShoppingList;
    @SerializedName("ShoppingItem")
    public List<ShoppingItem> ShoppingItems;
}

public class ShoppingList {
    public int id;
    public String name;
    public String created;
    public String modified;
}

public class ShoppingItem {
   public int id;
   public int shopping_item_category_id;
   public String name;
   public String description;
   public String created;
   public String modified;
   public String category_name;
}