之前一直使用Java自带的JSONObject,JSONArray来进行解析,在JSON嵌套不多,数据不大的时候还是不错的。但是对于大量的JSON数据来说,效率就比较低了。Gson是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。使用了面向对象的思想,提高了JSON解析的效率。
需要解析的JSON数据如下(JSON数据我保存为"languages.json",放在assets目录下。需要去下一个GSON.jar,放到libs文件夹下):
{
"language": [
{
"id": 1,
"name": "Java",
"ide": "Eclipse"
},
{
"id": 2,
"name": "C++",
"ide": "Visual Studio"
}
]
}
同时需要新建一个类,一一对应需要解析的属性值,如id/name/ide.(这里就用到了面向对象的思想)。新建Language.java如下:
public class Language { private String id; private String name; private String ide; public String getId() { return id; } public String getName() { return name; } public String getIde() { return ide; } public void setId(String id) { this.id = id; } public void setName(String name) { this.name = name; } public void setIde(String ide) { this.ide = ide; }}
最后主要使用GSON.jar中的GSON类进行解析,把解析结果显示在TextView,直接上代码:
public class MainActivity extends Activity { private TextView text; private String jsonString;//存放JSON字符串; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text = (TextView) findViewById(R.id.id_text); try { InputStreamReader inputStreamReader = new InputStreamReader(getAssets().open("languages.json"), "UTF-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader);//使用BufferReader读取输入流中的数据; String line; StringBuilder stringBuilder = new StringBuilder();//所有读取的json放到StringBuilder中,这里也可以使用StringBuffer,效果一样; while ((line = bufferedReader.readLine()) != null) { stringBuilder.append(line); } jsonString = stringBuilder.toString(); bufferedReader.close();//按相反的顺序关闭流; inputStreamReader.close(); parseJSON(jsonString);//调用使用GSON解析的方法; } catch (IOException e) { e.printStackTrace(); } } /** * 使用该方法用GSON进行解析; * * @param json */ private void parseJSON(String json) { try { Gson gson = new Gson(); Type type = new TypeToken<ArrayList<Language>>() { }.getType(); JSONObject root = new JSONObject(json);//这个root就是根对象,就是最外面的那个{}花括号; ArrayList<Language> language = gson.fromJson(root.getString("language"), type); int len = language.size();//获取该数组中有多少个子对象; for (int i = 0; i < len; i++) { Language lan = language.get(i);//获取数组中的第i个对象; text.append(lan.getId() + " " + lan.getName() + " " + lan.getIde()); text.append("\n"); } } catch (JSONException e) { e.printStackTrace(); } }}
程序运行后的显示效果如下:
。
至此,已经成功解析出JSON数据。
附GSON包下载地址:http://pan.baidu.com/s/1mgw1PUC