私は Gson を使用して、json オブジェクトを appengine から Android クライアントに問題なく転送していました。以下のコードを使用していました。
サーバ:
Query<WaterSupply> q = ofy.query(WaterSupply.class).filter("FdID", fdID)
.filter("timeUpdated >", lastUpdate);
Gson gson=new Gson();
resp.getWriter().print(gson.toJson(q.list()));
クライアント:
List<WaterSupply> list=new ArrayList<WaterSupply>();
String json1 =wsResult.wsResponse;
JsonElement json = new JsonParser().parse(json1);
JsonArray array= json.getAsJsonArray();
Iterator<JsonElement> iterator = array.iterator();
while(iterator.hasNext()){
JsonElement json2 = (JsonElement)iterator.next();
Gson gson = new Gson();
WaterSupply ws= gson.fromJson(json2, WaterSupply.class);
//can set some values in contact, if required
list.add(ws);
}//Unable to invoke no-args constructor for interface com.jackson.FirefighterLog.shared.WaterSupplyProxy.
//Register an InstanceCreator with Gson for this type may fix this problem.
Gson gson = new Gson();
Type listType = new TypeToken<List<WaterSupply>>(){}.getType();
List<WaterSupply> wsList = (List<WaterSupply>) gson.fromJson(wsResult.wsResponse, listType);
大きなオブジェクトの使用を開始しましたが、メモリ不足エラーが発生していたため、ストリーミング解析の実装に切り替える必要がありました。現在、次のコードを使用しています。
サーバー:上と同じ
クライアント:
public static List<WaterSupply> readJsonStream(InputStream in) throws IOException {
JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
Gson gson=new Gson();
List<WaterSupply> messages = new ArrayList<WaterSupply>();
reader.beginArray();
while (reader.hasNext()) {
WaterSupply message = gson.fromJson(reader, WaterSupply.class);
messages.add(message);
}
reader.endArray();
reader.close();
return messages;
}
これは改行文字 (/n) と関係があると思いますが、現時点ではよくわかりませんし、これを修正する方法もわかりません...何かアイデアはありますか?