我正在使用Volley Library来获取我的请求的JSON响应。我创建了基本的http Helper类,它们处理请求并返回JSON以进行下一步处理。
我想问一下处理返回的JSON数据的正确方法是什么?
我想使用数据在ListView
,View
等中显示,但我不知道什么是正确的方法(转换为POJO或将数据保存在JSON中?)
我试图找到关于这个主题的任何解决方案: Json to POJO mapping in Android
但似乎每个对象都应该有一个类,它定义了对象的所有可能字段。
这种方法对我来说似乎很奇怪,因为我已经为数据库对象创建了模型,如果更改了JSON对象(例如添加了新属性或更改了他的名字),这意味着API模型上的代码也应该被更改。
有没有其他可能性和正确的方法如何避免这种情况并仅使用活动(控制器)中的返回数据?
答案 0 :(得分:1)
使用GSON它非常活泼且易于使用。例如。
Gson gson = new Gson(); // Or use new GsonBuilder().create();
MyType target = new MyType();
String json = gson.toJson(target); // serializes target to Json
MyType target2 = gson.fromJson(json, MyType.class); // deserializes json into target2
答案 1 :(得分:1)
完全阅读我的回答,我已经以简单的方式解释了。
首先,如果您使用Volley不需要http帮助程序类,请使用Volley的方法通过对象或数组获取JSON数据。
第二个POJO课程最好用它。是的,这是正确的方法。
以下是从POJO中获取json对象数据和存储的源代码。
/ ** * json响应开始的json对象请求的方法{ * * / private void makeJsonObjectRequest(){
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.GET,
"http://api.example.com", null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(TAG, response.toString());
try {
// Parsing json object response
// response will be a json object
String name = response.getString("name");
String email = response.getString("email");
//POJO class to store
Person person = new Person();
person.name=name;
person.email=email;
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(),
"Error: " + e.getMessage(),
Toast.LENGTH_LONG).show();
}
hidepDialog();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
Toast.makeText(getApplicationContext(),
error.getMessage(), Toast.LENGTH_SHORT).show();
// hide the progress dialog
hidepDialog();
}
});
// Adding request to request queue
AppController.getInstance().addToRequestQueue(jsonObjReq);
}
答案 2 :(得分:1)
我肯定建议你将JSON转换为POJO并使用它。使用对象以面向对象语言(例如Java)表示数据更为自然。
我想问一下处理返回的JSON数据的正确方法是什么?
有两个主要选项:
无论您使用什么,只需确保在工作线程上完成JSON处理。如果你正在使用Volley,你应该考虑扩展一个Request类并重写parseNetworkResponse() - 这是插入你的反序列化的好地方。现在响应将是POJO,您可以使用它们来填充列表等。
就此而言:
这种方法在我看来很奇怪,因为我已经为数据库对象创建了模型,如果更改了JSON对象(例如添加了新属性或更改了他的名字),这意味着API模型上的代码也应该被更改。 / p>
不幸的是,你是对的。但这是客户端 - 服务器通信中的常见问题。在HTTP上使用JSON时,无法强制执行服务器和客户端之间的合同。你可以做的最好的,恕我直言,检测可能的异常并相应地处理它们 - 向用户显示消息,或类似的东西。您始终可以使用Maps将反序列化的有效负载保存为键 - 值对,但这并不能解决问题,但可确保反序列化逻辑不会失败。