2012-02-01 7 views
1

私は約1週間、CakePHPサーバーから取得しているJsonレスポンスを解析して解析しようとしています。私は応答が有効なJSONであり、それがあることを確認するために、メモ帳++用のプラグインを使用ParseJsonArray/ParseJsonObjectを使用してからGSON.fromJson(...)を使用するようにデータを構造化するには

[{"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"}}] 

:ここのような応答が見えるものです。

まず私はこの機能を試してみました:

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を使うためには、私のデータクラスを構築する必要があるかを教えてもらえます。

答えて

0

あなたの応答が実際にList<BaseObject>あるので、あなたはまた、 一覧baseObjectList =新しいGson()。fromJson(R、新しいTypeToken>(){} .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を変更する自由を持っていますか? IMHO、その構造は少し複雑です。

+0

私は申し訳ありませんが、私は私の元の投稿ではっきりしていないと思います。私はすでにそれを試みました。上記の投稿の編集をご覧ください。お試しいただきありがとうございます。 – GordoN

+0

実際には、あなたは十分にはっきりしていました。それは私の間違いでした。回答を更新しました:) – Nikhil

+0

私は返信を変更することができるかもしれませんが、私はPHPスキルが不足しており、私の時間はAndroidアプリを書くことに専念しています。私がこのアプリケーションの実用性を実証した後、次の段階にはより良いウェブサービスの開発が含まれます。 – GordoN

関連する問題