2015-08-24 24 views
3

我使用Volley Library来获取JSON响应请求。我创建了基本http帮助程序类,它处理请求并返回JSON以供下一次处理。Android:将JSON转换为POJO是否正确?

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

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

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

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

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

是否有任何其他的可能性和正确的方法如何避免这种情况,并只处理活动(控制器)返回的数据?

+0

你可以重复使用json模型在db或db模型中使用json – KOTIOS

+0

它们的结构是非常不同的,并不是所有的JSON实体在DB模型中都是相同的。我不认为将DB模型与JSON实体混合是一个好主意,因为我认为这会导致应用程序逻辑混乱。 – redrom

+0

为两者创建不同的pojo并没有什么坏处,或者如果是小的diffrance,那么你可以使用非json关键字的临时keywork – KOTIOS

回答

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

完全阅读我的答案,我已经用简单的方式解释了。

首先,如果您使用Volley不需要http helper类,请使用Volley的方法通过对象或数组获取JSON数据。

第二个POJO类最好用它。是的,这是正确的做法。

这里是获取JSON对象数据的源代码,它们是从POJO中抽出和存储的。

/** * 方法,使JSON对象请求,其中JSON响应开始wtih { * */ 私人无效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); 

}

+0

我会将解析逻辑从onResponse移开,因为此方法在主线程上执行。 –

+0

这只是一个小例子,所以我把解析逻辑放在那里 –

0

我肯定会建议你变换JSON到POJO并使用它。使用对象来表示面向对象语言(如Java)中的数据更自然。

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

主要有两种选择:

  1. 使用内置 - 在JSON SDK - 这是一个非常不错的工具,是充分的,如果你没有复杂的响应结构。它可以是相当高性能的。
  2. 使用某种第三方JSON处理库 - GSON或Jackson。它们具有功能性,例如基于注释等从JSON到POJO的自动反序列化,这可以节省您的时间,但它很昂贵。为了获得最佳性能,您仍然应该手动解析这些事情,但只有在需要优化时才可以开始执行此操作。

无论您使用什么,只要确保JSON处理在工作线程上完成。如果你正在使用Volley,你应该考虑扩展一个Request类并且重载parseNetworkResponse() - 这是插入你的反序列化的好地方。该答复现在是POJO和你可以用它们来填充列表等

至于这个云:因为我已经创建模型的数据库对象和

这种做法在我看来奇怪如果JSON对象发生变化(例如添加新属性或更改名称),这意味着API模型上的代码也应该更改。

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