Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:将JSON转换为POJO是正确的方法吗?_Android_Json_Rest_Android Volley_Pojo - Fatal编程技术网

Android:将JSON转换为POJO是正确的方法吗?

Android:将JSON转换为POJO是正确的方法吗?,android,json,rest,android-volley,pojo,Android,Json,Rest,Android Volley,Pojo,我正在使用Volley库获取请求的JSON响应。我创建了基本http帮助器类,用于处理请求并返回JSON以供下一步处理 我想问一下,处理返回的JSON数据的正确方法是什么 我想使用数据在列表视图、视图等中显示,但我不知道什么是正确的方法(转换为POJO或将数据保存在JSON中?) 我试图找到关于这个话题的任何解决方案: 但似乎每个对象都应该有一个类,该类定义了对象的所有可能字段 这种方法对我来说似乎很奇怪,因为我已经为数据库对象创建了模型,如果JSON对象发生了更改(例如添加了新属性或更改了其

我正在使用Volley库获取请求的JSON响应。我创建了基本http帮助器类,用于处理请求并返回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 SDK——这是一个非常不错的工具,如果您没有复杂的响应结构,它就足够了
  • 使用某种第三方JSON处理库-GSON或Jackson。它们附带了许多功能,如根据注释自动从JSON反序列化到POJO等。这可以节省时间,但代价高昂。要获得最佳性能,您仍然应该手动解析,但您可以开始这样做只有当你需要优化的时候
  • 不管你使用什么,只要确保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);