Jackson + volley - TypeReference是抽象的

时间:2016-07-31 19:59:56

标签: android json jackson android-volley

我试图从一个url获取一个简单的json对象(不是数组,只是{} s),而且我遇到两个错误:

Error:(43, 81) error: TypeReference is abstract; cannot be instantiated

Error:(36, 16) error: no suitable constructor found for JsonObjectRequest(String,<anonymous Listener<JSONObject>>,<anonymous ErrorListener>) 
constructor JsonObjectRequest.JsonObjectRequest(String,JSONObject,Listener<JSONObject>,ErrorListener) is not applicable (actual and formal argument lists differ in length) 
constructor JsonObjectRequest.JsonObjectRequest(int,String,JSONObject,Listener<JSONObject>,ErrorListener) is not applicable (actual and formal argument lists differ in length)

这是我的OnCreate代码:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_details);

    String url = getResources().getString(R.string.json_url);
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(GetJsonObject(url));
}

这是我的JsonObject方法:

@NonNull
    private JsonObjectRequest GetJsonObject(String url) {
        return new JsonObjectRequest(url, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                try {
                    if (response.length() > 0) {
                        Details results = mapper.readValue(response.toString(), new TypeReference<Details>());
                        String a = response.toString();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getApplicationContext(), getResources().getString(R.string.no_internet), Toast.LENGTH_LONG).show();
            }
        });
    }

我不明白错误,尤其是TypeReference错误,因为我有另一个代码(和jsonarray一样)似乎就是这样。

提前致谢!

1 个答案:

答案 0 :(得分:1)

问题:您Method.GET上缺少JSONObject jsonObjectJsonObjectRequest个参数

这是构造函数,注意第一个和第三个参数。

public JsonObjectRequest(int method, String url, JSONObject jsonRequest,
        Listener<JSONObject> listener, ErrorListener errorListener)

或者,也是这个

public JsonObjectRequest(String url, JSONObject jsonRequest,
        Listener<JSONObject> listener, ErrorListener errorListener)

您将null传递给JSONObject以使其成为GET请求的位置。

尽管如此,你正在使用Volley倒退; as-in强制它回到同步方法模式。你需要记住回调。

例如,采用这种剥离方法。参数化两个侦听器。

@NonNull
private JsonObjectRequest GetJsonObject(String url, Response.Listener<JSONObject> onSuccess, Response.ErrorListener onError) {
    return new JsonObjectRequest(url, null, onSuccess, onError);
} 

它基本上与单独制作Volley请求相同。

现在,假设Details实际上是一个对象,而不是List,就像你声称的那样。使用Jackson时,不要使用TypeReference

回到Volley,另一种模式是不返回请求,而是实际启动一个请求,然后将回调转到需要该数据的位置。此外,您正在将JSONObject转回杰克逊的String,因此您可以使用StringRequest代替public void getJSONObject(String url, Response.Listener<String> responseListener) { // Just some never-changing error message. final Response.ErrorListener errorListener = new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("Error", error.toString()); Toast.makeText(getApplicationContext(), getResources().getString(R.string.no_internet), Toast.LENGTH_LONG).show(); } }); }; StringRequest req = new StringRequest(url, responseListener, errorListener); addToRequestQueue(req); // TODO: Need to add to a RequestQueue }

public void foo(String url) {
        final ObjectMapper mapper = // etc...            

        // Can declare various listeners to do different things with the String response from the URL
        Response.Listener<String> responseListener = new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    if (response.length() > 0) {
                        Details result = mapper.readValue(response, Details.class);
                        // TODO: Do something with the object
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };   

        // Execution returned above, when finished with request
        getJsonObject(url, responseListener);
}

并称之为

DataParser