1

私は 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) と関係があると思いますが、現時点ではよくわかりませんし、これを修正する方法もわかりません...何かアイデアはありますか?

4

2 に答える 2

1

私はGSonの経験がありませんが、終了していないエラーは通常、切り捨てまたはパーサーエラーを示します(上記のとおり)。同じ問題を抱えている他の人を見つけたので、他の考えられる「特殊文字」を修正することをお勧めします。この投稿では、org.json.JSONException:737 [文字738行1]の終了していない文字列、問題はアンパサンド文字でした。

よろしくお願いします。

于 2012-07-08T17:36:07.860 に答える
0

サーバーから送信された応答が切り捨てられているようです。これを行うためにサーバー コードを変更すると、次のように役立つ場合があります。

Writer writer = resp.getWriter();
gson.toJson(q.list(), writer);
writer.close();
于 2012-07-08T12:57:00.170 に答える