我试图从一个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一样)似乎就是这样。
提前致谢!
答案 0 :(得分:1)
问题:您Method.GET
上缺少JSONObject jsonObject
和JsonObjectRequest
个参数
这是构造函数,注意第一个和第三个参数。
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