之前讨论过用GSON解析较为简单的JSON,这次稍微增加一点难度。把JSON弄的复杂一点,使JSON变为2层嵌套,并增加了一些其他元素。代码中把language.json放到assets文件夹下,把GSON.jar放到libs文件夹下。如果用的是Android Studio,需要右键GSON,jar,选择Add As Lirbary,否则AS不能识别。Eclipse中不需要这个步骤。具体解析以下三种类型的JSON:
"first": "mobile",
"second": "pc",
"app": { "google": "android", "apple": "iOS", "microsoft": "wp" }
"language": [ { "id": 1, "name": "Java", "ide": "Eclipse" }, { "id": 2, "name": "C++", "ide": "Visual Studio" } ]
languages.json的JSON代码总体如下:
{ "first": "mobile", "second": "pc", "app": { "google": "android", "apple": "iOS", "microsoft": "wp" }, "language": [ { "id": 1, "name": "Java", "ide": "Eclipse" }, { "id": 2, "name": "C++", "ide": "Visual Studio" } ]}
对于三种不同的类型,分别建立3个类,用于映射JSON中的属性。
Root.java如下:
public class Root { private String first; private String second; public void setFirst(String first) { this.first = first; } public void setSecond(String second) { this.second = second; } public String getFirst() { return first; } public String getSecond() { return second; }}
App.java如下:
public class App { private String google; private String apple; private String microsoft; public void setGoogle(String google) { this.google = google; } public void setApple(String apple) { this.apple = apple; } public void setMicrosoft(String microsoft) { this.microsoft = microsoft; } public String getGoogle() { return google; } public String getApple() { return apple; } public String getMicrosoft() { return microsoft; }}
Language.java如下:
public class Language { private String id; private String name; private String 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; } public String getId() { return id; } public String getName() { return name; } public String getIde() { return ide; }}
以上的三个类体现了GSON解析的面向对象的思想。使用类中的属性来对应JSON中的键,使用类中的get方法来获取JSON中的值。解析的过程如下,直接上代码:
public class MainActivity extends Activity { private TextView text; private String jsonString; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text = (TextView) findViewById(R.id.id_text); getJSONString();//从language.json中获得JSON字符串; parseRoot(jsonString); parseApp(jsonString); parseLanguage(jsonString); } /** * 从languages.json中读取JSON字符串; */ public void getJSONString() { 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(); } catch (IOException e) { e.printStackTrace(); } } /** * 先解析: * "first": "mobile", * "second": "pc", * 也就是JSON的第一层嵌套; * * @param json */ private void parseRoot(String json) { Gson gson = new Gson(); Root root = gson.fromJson(json, Root.class); text.append(root.getFirst() + "\n"); text.append(root.getSecond() + "\n"); } /** * 然后解析: * "app": { * "google": "android", * "apple": "iOS", * "microsoft": "wp" * } * * @param json */ private void parseApp(String json) { try { Gson gson = new Gson(); JSONObject roo = new JSONObject(json); App app = gson.fromJson(roo.getString("app"), App.class); text.append(app.getGoogle() + " " + app.getApple() + " " + app.getMicrosoft() + "\n"); } catch (JSONException e) { e.printStackTrace(); } } /** * 最后解析:也就是JSON数组。 * "language": [ * { * "id": 1, * "name": "Java", * "ide": "Eclipse" * }, * { * "id": 2, * "name": "C++", * "ide": "Visual Studio" * } * ] * * @param json */ private void parseLanguage(String json) { try { Gson gson = new Gson(); Type type = new TypeToken<ArrayList<Language>>() { }.getType(); JSONObject roo = new JSONObject(json); ArrayList<Language> languages = gson.fromJson(roo.getString("language"), type); for (int i = 0; i < languages.size(); i++) { Language lan = languages.get(i); text.append(lan.getId() + " " + lan.getName() + " " + lan.getIde() + "\n"); } } catch (JSONException e) { e.printStackTrace(); } }}
程序实现的效果如下:
。
至此,已经成功实现用GSON解析较为复杂的JSON。
附GSON包下载:http://pan.baidu.com/s/1ntuxTRr