2017-03-19 8 views
1

私はAndroidアプリケーションを開発中で、JsonObject/JsonArrayをサーバーから取得しています。文字列をJsonに手動で変換すると正常に動作します。
私は最近、サーバー要求のためにVolleyに切り替えて、JsonObjectRequest/JsonArrayRequest(単純なStringRequestではなく)を使用してjsonを直接取得し、最初に文字列を変換することについて悩ます必要がないようにしたい(Json Requests右?)。 しかし、コードは常にonErrorResponseになり、ParseErrorはString cannot be converted to a JsonObject/JsonArray(たとえ構文がまったく問題ないようですが)と言っています。 サーバーの応答をUTF8(hereのように)に変換することで、潜在的な「見えない」文字を排除しようとしましたが、問題を解決するようには見えません。また、iOSのバージョンでは、同じレスポンスで問題が発生していないようです(基本的な解析アルゴリズムは非常に異なる可能性があります)。Volley Jsonリクエストが機能しない - 文字列をJsonObject/JsonArrayに変換できない

もちろん、StringRequestsで作業したり、カスタムリクエストを作成したりすると、(他のいくつかのスタックオーバーフローのディスカッションで提案されているように)ジョブが実行されますが、Json Requestsを動作させることはできません。誰もこの問題を抱えていましたか?潜在的な原因と解決方法を知ることは素晴らしいことでしょう!

答えて

1

私は答えを見つけました。 JsonObjectRequest/JsonArrayRequestは、さらにJsonObject/JsonArrayオブジェクトを引数としてとります。オンラインのほとんどのサンプルコードでは、この引数はnullに設定されています.Jsonを送信したくないため、受信するだけで同じ結果を出しました。 Volley Jsonのリクエストの裏に(非常に直感的に)何が起こるかは、この引数がnullの場合、要求はPOST要求としてではなく、GETとして行われるということです。これにより、私の要求が失敗し、サーバーがjsonではなくエラーコードを返すようになりました。そのようなエラーコードはもちろん、jsonに解析できませんでした。 Volleyのデフォルトの実装には非常に悪い選択肢があります。

public class CustomJsonObjectRequest extends Request<JSONObject> { 

protected static final String PROTOCOL_CHARSET = "utf-8"; 

private final Response.Listener<JSONObject> mListener; 

public CustomJsonObjectRequest(String url, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) { 
    super(Method.POST, url, errorListener); 
    mListener = listener; 
} 

@Override 
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { 
    try { 
     String jsonString = new String(response.data, 
       HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET)); 
     return Response.success(new JSONObject(jsonString), 
       HttpHeaderParser.parseCacheHeaders(response)); 
    } catch (UnsupportedEncodingException e) { 
     return Response.error(new ParseError(e)); 
    } catch (JSONException je) { 
     return Response.error(new ParseError(je)); 
    } 
    } 

    @Override 
    protected void deliverResponse(JSONObject response) { 
    mListener.onResponse(response); 
    } 

} 
:いずれの場合で

、溶液は、POST要求に付着することを除いて、ライブラリから実装に非常に類似しているCustomJsonObjectRequestを導入するのと同じくらい簡単でした

関連する問題