java - Volley : Create a method that takes care of both JSONArrayRequest and JSONObjectRequest

标签 java android android-volley

这里是新手。 我正在和我的 friend 一起开发一个简单的客户端-服务器 Android 应用程序,尽我所能编写最干净、最漂亮的代码,严格遵循 SOLID 原则并使用设计模式来解耦我的类和组件。我写了这个方法,希望它是我必须编写的唯一网络代码:

private void VolleyJSONPostParserRequest(String url, JSONObject requestBody, 
    final Handler handler, final IParser replyParser) {
       JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
            (Request.Method.POST, url, requestBody, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {    
                try {
                    Object parsedResponse = replyParser.parse(response.toString());
                    notifyObservers(handler, parsedResponse);
                } catch (Exception e) {
                    Log.e(TAG,handler.getClassName() + " reply parsing error!");
                    notifyObservers(handler, null); }
                }
                }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                Log.e(TAG,"Error receiving response for " + handler.getClassName());
                notifyObservers(handler, null);
                }
                });
        }

令我不满的是,我发现服务器的回复有时会是一个 JSONObject,有时会是一个 JSONArray。我不想复制粘贴整个内容并将“JsonObjectRequest”替换为“JsonArrayRequest”。这个问题有什么好的解决方案?或者这是我最好只复制和粘贴的情况之一?

最佳答案

在我看来,您应该实现自定义请求(例如,public class CustomRequest extends Request<NetworkResponse>)。请阅读以下 Google 培训文档以获取更多信息:

Google Volley - Implementing a Custom Request

然后...

@Override
public void onResponse(NetworkResponse response) {
    try {
        final String jsonString = new String(response.data,
                HttpHeaderParser.parseCharset(response.headers));
        // Check if it is JSONObject or JSONArray
        Object json = new JSONTokener(jsonString).nextValue();          
        if (json instanceof JSONObject) {
            //do something...
        } else if (json instanceof JSONArray) {
            //do something...
        } else {
            //do something...
        }
        ...
    } catch (UnsupportedEncodingException | JSONException e) {
        e.printStackTrace();
    }
}

关于java - Volley : Create a method that takes care of both JSONArrayRequest and JSONObjectRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39778798/

相关文章:

java - MyBatis - 一对多 - 未为映射列设置值

java - 使用 Spring Boot 在 Google 应用引擎中执行 Cron 作业

php - Android Volley 库

android - 如何使按钮在视频 View 中可见 "OnPreparedListener"方法

android - ListView 中的 setOnItemClickListener VS setOnItemSelectedListener。

java - 如何在 Android 中获取 volley JSONArray

php - 使用 PHP 将 JSON 数组发送到 Android Volley

java - 使用 DefaultListModel 和 JList 显示列表

java - LibGDX Sprite + Box2D CircleShape : Positioning while taking into account origin

android - 在 PhoneGap 的情况下,HTML5 SQLite 与 native 数据库