Android:将JSON转换为POJO是正确的方法吗?
我正在使用Volley库获取请求的JSON响应。我创建了基本http帮助器类,用于处理请求并返回JSON以供下一步处理 我想问一下,处理返回的JSON数据的正确方法是什么 我想使用数据在Android:将JSON转换为POJO是正确的方法吗?,android,json,rest,android-volley,pojo,Android,Json,Rest,Android Volley,Pojo,我正在使用Volley库获取请求的JSON响应。我创建了基本http帮助器类,用于处理请求并返回JSON以供下一步处理 我想问一下,处理返回的JSON数据的正确方法是什么 我想使用数据在列表视图、视图等中显示,但我不知道什么是正确的方法(转换为POJO或将数据保存在JSON中?) 我试图找到关于这个话题的任何解决方案: 但似乎每个对象都应该有一个类,该类定义了对象的所有可能字段 这种方法对我来说似乎很奇怪,因为我已经为数据库对象创建了模型,如果JSON对象发生了更改(例如添加了新属性或更改了其
列表视图
、视图
等中显示,但我不知道什么是正确的方法(转换为POJO或将数据保存在JSON中?)
我试图找到关于这个话题的任何解决方案:
但似乎每个对象都应该有一个类,该类定义了对象的所有可能字段
这种方法对我来说似乎很奇怪,因为我已经为数据库对象创建了模型,如果JSON对象发生了更改(例如添加了新属性或更改了其名称),这意味着API模型上的代码也应该更改
有没有其他的可能性和正确的方法来避免这种情况,并且只在活动(控制器)中使用返回的数据?使用它非常简单易用。例如
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
仔细阅读我的答案,我已经用简单的方式解释了 首先,如果您使用的是无需http助手类的Volley,请使用Volley的方法通过对象或数组获取JSON数据 第二个POJO类最好使用它。是的,这是正确的方法 下面是从volley获取json对象数据并存储在POJO中的源代码 /** *方法在json响应启动时发出json对象请求{ * */ 私有void makeJsonObjectRequest(){
JsonObjectRequest JSONObjectReq=新的JsonObjectRequest(Method.GET,
"http://api.example.com,null,新响应。侦听器(){
@凌驾
公共void onResponse(JSONObject响应){
Log.d(TAG,response.toString());
试一试{
//解析json对象响应
//响应将是一个json对象
字符串名称=response.getString(“名称”);
String email=response.getString(“email”);
//要存储的POJO类
Person=新人();
person.name=姓名;
person.email=电子邮件;
}捕获(JSONException e){
e、 printStackTrace();
Toast.makeText(getApplicationContext(),
“错误:”+e.getMessage(),
Toast.LENGTH_LONG).show();
}
hidepDialog();
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
d(标记“Error:+Error.getMessage());
Toast.makeText(getApplicationContext(),
错误.getMessage(),Toast.LENGTH_SHORT).show();
//隐藏进度对话框
hidepDialog();
}
});
//将请求添加到请求队列
AppController.getInstance().addToRequestQueue(JSONOBJEQ);
}我绝对建议您将JSON转换为POJO并使用它。使用面向对象语言(如Java)来表示数据要自然得多 我想问一下,处理返回的JSON数据的正确方法是什么 主要有两种选择:
不管你使用什么,只要确保JSON处理是在一个工作者线程上完成的。如果你正在使用截击,你应该考虑扩展一个请求类并重写PrSeNeWorkRebug()。这是一个插入反序列化的好地方。现在的响应是POJOs,你可以用它们填充列表,等等。 就这一点而言:
这种方法在我看来似乎很奇怪,因为我已经为数据库对象创建了模型,如果JSON对象发生了更改(例如添加了新属性或更改了其名称),这意味着API模型上的代码也应该更改不幸的是,你是对的。但这是客户机-服务器通信中的一个常见问题。在HTTP上使用JSON时,无法强制执行服务器和客户机之间的约定。IMHO,你能做的最好的事情是检测可能的异常并相应地处理它们——向用户显示消息,或者其他什么就像那样。你总是可以使用映射将反序列化的有效负载作为键值对保存,但这并不能真正解决问题,而是确保反序列化逻辑不会失败。u可以在db中重用json模型,或者在带有json的db模型中重用json模型。它们的结构非常不同,并且不是所有json实体在db模型中都是等效的。我不这么认为将DB模型与JSON实体混合使用是个好主意,因为我认为这会导致应用程序逻辑混乱。为两者创建不同的pojo没有害处,否则如果存在细微差异,则可以对非JSON密钥使用瞬态密钥。现在,您可以在安卓studio内生成pojo。我会将解析逻辑从onResponse移开,因为方法在主线程上执行
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);