如何构建我的数据以使用ParseJsonArray / ParseJsonObject切换到使用GSON.fromJson(...)

时间:2012-02-01 04:21:13

标签: android gson

我一直在与GSON一起尝试解析我从CakePHP服务器获得的Json响应大约一周。这是响应的样子:

[{"BaseObject":  {"field1":"1","field2":"1639","field3":"10","field4":"1","field5":"12","field6":"10.765984","field7":"-25.768357","field8":"1327790850"}},{"BaseObject":{"field1":"2","field2":"1934","field3":"19","field4":"30","field5":"2","field6":"10.758662","field7":"-25.769684","field8":"1327790850"}},{"BaseObject":{"field1":"3","field2":"2567","field3":"33","field4":"6","field5":"98","field6":"10.758786","field7":"-25.769843","field8":"1327790850"}},{"BaseObject":{"field1":"4","field2":"0","field3":"33","field4":"7","field5":"0","field6":"10.758786","field7":"-20.769843","field8":"1327790850"}},{"BaseObject":{"field1":"5","field2":"1097","field3":"33","field4":"1","field5":"0","field6":"15.758786","field7":"50.769843","field8":"1327790850"}},{"BaseObject":{"field1":"6","field2":"1936","field3":"50","field4":"0","field5":"9","field6":"19.234987","field7":"-67.340065","field8":"1327798560"}}] 

我使用Notepad ++的插件来验证响应是否有效,Json就是。

首先我尝试了这个功能:

  
public static List<BaseObject> parserInputStreamGson(InputStream stream)
{ 
  List<BaseObject> objList = new ArrayList<BaseObject>();

  if(stream != null){
    Gson gson = new Gson();
    Reader r = new InputStreamReader(stream);

    Log.d(TAG,"Trying to Parse Reader");
    try{
        objList = gson.fromJson(r, new TypeToken<List<BaseObject>>() {}.getType() );
       } catch (JsonSyntaxException e) {
           Log.d(TAG, "JsonSyntaxException : " + e.getMessage() );
       } catch (JsonIOException e) {
           Log.d(TAG, "JsonIOException : " + e.getMessage() );
       } finally {
           try {
               r.close();
           } catch (IOException e) {
               Log.d(TAG, "IOException : " + e.getMessage() );
           }
       }
  }
  Log.d(TAG,"BaseObject[] = " + objList.toString());
  return objList;
}

然后我尝试了这个功能:

public static BaseObject[] parserInputStreamGsonArray(InputStream stream)
{
  BaseObject[] objectArray = null;
  if (stream != null) {
    Gson gson = new Gson();
    Reader r = new InputStreamReader(stream);

    Log.d(TAG, "Trying to Parse Reader");
    try {
        objectArray = gson.fromJson(r, new TypeToken<Event[]>() {}.getType());
    } catch (JsonSyntaxException e) {
        Log.d(TAG, "JsonSyntaxException : " + e.getMessage());
    } catch (JsonIOException e) {
        Log.d(TAG, "JsonIOException : " + e.getMessage());
    } finally {
        try {
            r.close();
        } catch (IOException e) {
            Log.d(TAG, "IOException : " + e.getMessage());
        }
    }
  }
  if(eventArray != null){
    for(int m=0;m<eventArray.length;m++){
        Log.d(TAG, "objectArray[" + String.valueOf(m) + "] = " + objectArray[m].toString());
    }
   }    
  return objectArray;
}

在两种情况下,Gson都返回了5个对象,但所有字段都设置为零。

最后我使用了这个功能,但感觉很笨重。

public static List<BaseObject> ParseInputStream(InputStream stream) {
    Reader r = new InputStreamReader(stream);
    List<BaseObject> baseObjectList = new ArrayList<BaseObject>();

    try {
        JsonParser parser = new JsonParser();
        JsonArray array = parser.parse(r).getAsJsonArray();
        JsonObject topObject = new JsonObject();
        JsonObject subObject = new JsonObject();

        for (int m = 0; m < array.size(); m++) {
            if (array.get(m).isJsonObject()) {
                topObject = array.get(m).getAsJsonObject();

                if (topObject.get("BaseObject").isJsonObject()) {
                    subObject = topObject.get("BaseObject").getAsJsonObject();

                    BaseObject baseobject = new BaseObject();

                    baseobject.field1 = subObject.get("field1").getAsLong();
                    baseobject.field2 = subObject.get("field2").getAsInt();
                    baseobject.field3 = subObject.get("field3").getAsLong();
                    baseobject.field4 = subObject.get("field4").getAsInt();
                    baseobject.field5 = subObject.get("field5").getAsInt();
                    baseobject.field6 = subObject.get("field6").getAsDouble();
                    baseobject.field7 = subObject.get("field7").getAsDouble();
                    baseobject.field8 = subObject.get("field8").getAsLong();

                    baseObjectList.add(baseobject);
                } else {
                    Log.e(TAG, "topObject[" + String.valueOf(m)+ "].subObject is not a JsonObject");
                }

            } else {
                Log.e(TAG, "Array # " + String.valueOf(m)+ " is not a JsonObject!");
            }
        }
    } catch (Exception ex) {
        Log.e(TAG, "Exception thrown = " + ex.toString());
        ex.printStackTrace();
    }
    return baseObjectList;
}  

这是我为BaseObject创建的类。

public class BaseObject {

@SerializedName("field1")
public long field1;
@SerializedName("field2")
public int field2;
@SerializedName("field3")
public long field3;
@SerializedName("field4")
public int field4;
@SerializedName("field5")
public int field5;
@SerializedName("field6")
public double field6;
@SerializedName("field7")
public double field7;
@SerializedName("field8")
public long field8;

@Override
public String toString() {
    return  "(" + 
            "field1= " + String.valueOf(this.field1) + ", " +
            "field2= " + String.valueOf(this.field2) + ", " +
            "field3= " + String.valueOf(this.field3) + ", " +
            "field4= " + String.valueOf(this.field4) + ", " +
            "field5= " + String.valueOf(this.field5) + ", " +
            "field6= " + String.valueOf(this.field6) + ", " +
            "field7= " + String.valueOf(this.field7) + ", " +
            "field8= " + String.valueOf(this.field8) +
            ")";
}

}

任何人都可以告诉我如何构建我的数据类以便使用Gson.fromJson工作。

1 个答案:

答案 0 :(得分:0)

由于您的回复实际上是List<BaseObject>,您应该使用     列出baseObjectList = new Gson()。fromJson(r,new TypeToken&gt;(){}。getType())

另外我应该提一下,你真的不需要使用@SerializedName注释,因为你在json回复和类中的属性名是相同的。

<强>更新 哎呀..对不起,我应该在回答之前尝试过你的代码。请参阅以下代码。一切都归结为课程的结构。

public class Sample {

    public static class Wrapper{
        private BaseObject BaseObject;
        @Override
        public String toString() {          
            return BaseObject == null? null : BaseObject.toString();
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String json = "[{\"BaseObject\":  {\"field1\":\"1\",\"field2\":\"1639\",\"field3\":\"10\",\"field4\":\"1\",\"field5\":\"12\",\"field6\":\"10.765984\",\"field7\":\"-25.768357\",\"field8\":\"1327790850\"}},{\"BaseObject\":{\"field1\":\"2\",\"field2\":\"1934\",\"field3\":\"19\",\"field4\":\"30\",\"field5\":\"2\",\"field6\":\"10.758662\",\"field7\":\"-25.769684\",\"field8\":\"1327790850\"}},{\"BaseObject\":{\"field1\":\"3\",\"field2\":\"2567\",\"field3\":\"33\",\"field4\":\"6\",\"field5\":\"98\",\"field6\":\"10.758786\",\"field7\":\"-25.769843\",\"field8\":\"1327790850\"}},{\"BaseObject\":{\"field1\":\"4\",\"field2\":\"0\",\"field3\":\"33\",\"field4\":\"7\",\"field5\":\"0\",\"field6\":\"10.758786\",\"field7\":\"-20.769843\",\"field8\":\"1327790850\"}},{\"BaseObject\":{\"field1\":\"5\",\"field2\":\"1097\",\"field3\":\"33\",\"field4\":\"1\",\"field5\":\"0\",\"field6\":\"15.758786\",\"field7\":\"50.769843\",\"field8\":\"1327790850\"}},{\"BaseObject\":{\"field1\":\"6\",\"field2\":\"1936\",\"field3\":\"50\",\"field4\":\"0\",\"field5\":\"9\",\"field6\":\"19.234987\",\"field7\":\"-67.340065\",\"field8\":\"1327798560\"}}]";

        List<Wrapper> results = new Gson().fromJson(json,new TypeToken<List<Wrapper>>(){}.getType());
        System.out.println(results);
    }
}

好奇,您是否可以自由更改来自服务器的JSON回复?恕我直言,它的结构有点复杂。