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

时间:2015-08-24 11:11:48

标签: android json rest android-volley pojo

我正在使用Volley Library来获取我的请求的JSON响应。我创建了基本的http Helper类,它们处理请求并返回JSON以进行下一步处理。

我想问一下处理返回的JSON数据的正确方法是什么?

我想使用数据在ListViewView等中显示,但我不知道什么是正确的方法(转换为POJO或将数据保存在JSON中?)

我试图找到关于这个主题的任何解决方案: Json to POJO mapping in Android

但似乎每个对象都应该有一个类,它定义了对象的所有可能字段。

这种方法对我来说似乎很奇怪,因为我已经为数据库对象创建了模型,如果更改了JSON对象(例如添加了新属性或更改了他的名字),这意味着API模型上的代码也应该被更改。

有没有其他可能性和正确的方法如何避免这种情况并仅使用活动(控制器)中的返回数据?

3 个答案:

答案 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数据的正确方法是什么?

有两个主要选项:

  1. 使用内置的JSON SDK - 它是一个非常不错的工具,如果您没有复杂的响应结构就足够了。它可以非常高效。
  2. 使用某种第三方JSON处理库 - GSON或Jackson。它们具有功能,例如基于注释从JSON到POJO的自动反序列化等。这可以节省您的时间,但是它很昂贵。为了获得最佳性能,您仍应手动解析这些内容,但只有在需要优化时才能开始执行此操作。
  3. 无论您使用什么,只需确保在工作线程上完成JSON处理。如果你正在使用Volley,你应该考虑扩展一个Request类并重写parseNetworkResponse() - 这是插入你的反序列化的好地方。现在响应将是POJO,您可以使用它们来填充列表等。

    就此而言:

      

    这种方法在我看来很奇怪,因为我已经为数据库对象创建了模型,如果更改了JSON对象(例如添加了新属性或更改了他的名字),这意味着API模型上的代码也应该被更改。 / p>

    不幸的是,你是对的。但这是客户端 - 服务器通信中的常见问题。在HTTP上使用JSON时,无法强制执行服务器和客户端之间的合同。你可以做的最好的,恕我直言,检测可能的异常并相应地处理它们 - 向用户显示消息,或类似的东西。您始终可以使用Maps将反序列化的有效负载保存为键 - 值对,但这并不能解决问题,但可确保反序列化逻辑不会失败。