Android中使用GSON包解析JSON数据(复杂JSON)

来源:互联网 发布:苹果8手机怎么打开网络 编辑:程序博客网 时间:2024/06/07 03:53

之前讨论过用GSON解析较为简单的JSON,这次稍微增加一点难度。把JSON弄的复杂一点,使JSON变为2层嵌套,并增加了一些其他元素。代码中把language.json放到assets文件夹下,把GSON.jar放到libs文件夹下。如果用的是Android Studio,需要右键GSON,jar,选择Add As Lirbary,否则AS不能识别。Eclipse中不需要这个步骤。具体解析以下三种类型的JSON:

[java] view plain copy
 print?
  1. "first""mobile",  
  2. "second""pc",  

[java] view plain copy
 print?
  1. "app": {  
  2.        "google""android",  
  3.        "apple""iOS",  
  4.        "microsoft""wp"  
  5.    }  

[java] view plain copy
 print?
  1. "language": [  
  2.        {  
  3.            "id"1,  
  4.            "name""Java",  
  5.            "ide""Eclipse"  
  6.        },  
  7.        {  
  8.            "id"2,  
  9.            "name""C++",  
  10.            "ide""Visual Studio"  
  11.        }  
  12.    ]  

languages.json的JSON代码总体如下:

[java] view plain copy
 print?
  1. {  
  2.     "first""mobile",  
  3.     "second""pc",  
  4.     "app": {  
  5.         "google""android",  
  6.         "apple""iOS",  
  7.         "microsoft""wp"  
  8.     },  
  9.     "language": [  
  10.         {  
  11.             "id"1,  
  12.             "name""Java",  
  13.             "ide""Eclipse"  
  14.         },  
  15.         {  
  16.             "id"2,  
  17.             "name""C++",  
  18.             "ide""Visual Studio"  
  19.         }  
  20.     ]  
  21. }  

        对于三种不同的类型,分别建立3个类,用于映射JSON中的属性。

Root.java如下:

[java] view plain copy
 print?
  1. public class Root {  
  2.   
  3.     private String first;  
  4.     private String second;  
  5.   
  6.     public void setFirst(String first) {  
  7.         this.first = first;  
  8.     }  
  9.   
  10.     public void setSecond(String second) {  
  11.         this.second = second;  
  12.     }  
  13.   
  14.     public String getFirst() {  
  15.   
  16.         return first;  
  17.     }  
  18.   
  19.     public String getSecond() {  
  20.         return second;  
  21.     }  
  22. }  

App.java如下:

[java] view plain copy
 print?
  1. public class App {  
  2.   
  3.     private String google;  
  4.     private String apple;  
  5.     private String microsoft;  
  6.   
  7.     public void setGoogle(String google) {  
  8.         this.google = google;  
  9.     }  
  10.   
  11.     public void setApple(String apple) {  
  12.         this.apple = apple;  
  13.     }  
  14.   
  15.     public void setMicrosoft(String microsoft) {  
  16.         this.microsoft = microsoft;  
  17.     }  
  18.   
  19.     public String getGoogle() {  
  20.   
  21.         return google;  
  22.     }  
  23.   
  24.     public String getApple() {  
  25.         return apple;  
  26.     }  
  27.   
  28.     public String getMicrosoft() {  
  29.         return microsoft;  
  30.     }  
  31. }  

Language.java如下:

[java] view plain copy
 print?
  1. public class Language {  
  2.   
  3.     private String id;  
  4.     private String name;  
  5.     private String ide;  
  6.   
  7.     public void setId(String id) {  
  8.         this.id = id;  
  9.     }  
  10.   
  11.     public void setName(String name) {  
  12.         this.name = name;  
  13.     }  
  14.   
  15.     public void setIde(String ide) {  
  16.         this.ide = ide;  
  17.     }  
  18.   
  19.     public String getId() {  
  20.   
  21.         return id;  
  22.     }  
  23.   
  24.     public String getName() {  
  25.         return name;  
  26.     }  
  27.   
  28.     public String getIde() {  
  29.         return ide;  
  30.     }  
  31. }  

       以上的三个类体现了GSON解析的面向对象的思想。使用类中的属性来对应JSON中的键,使用类中的get方法来获取JSON中的值。解析的过程如下,直接上代码:

[java] view plain copy
 print?
  1. public class MainActivity extends Activity {  
  2.   
  3.     private TextView text;  
  4.     private String jsonString;  
  5.   
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.activity_main);  
  10.         text = (TextView) findViewById(R.id.id_text);  
  11.         getJSONString();//从language.json中获得JSON字符串;  
  12.         parseRoot(jsonString);  
  13.         parseApp(jsonString);  
  14.         parseLanguage(jsonString);  
  15.     }  
  16.   
  17.     /** 
  18.      * 从languages.json中读取JSON字符串; 
  19.      */  
  20.     public void getJSONString() {  
  21.         try {  
  22.             InputStreamReader inputStreamReader = new InputStreamReader(getAssets().open("languages.json"), "UTF-8");  
  23.             BufferedReader bufferedReader = new BufferedReader(inputStreamReader);//使用BufferReader读取输入流中的数据;  
  24.             String line;  
  25.             StringBuilder stringBuilder = new StringBuilder();//所有读取的json放到StringBuilder中,这里也可以使用StringBuffer,效果一样;  
  26.             while ((line = bufferedReader.readLine()) != null) {  
  27.                 stringBuilder.append(line);  
  28.             }  
  29.             jsonString = stringBuilder.toString();  
  30.             bufferedReader.close();//按相反的顺序关闭流;  
  31.             inputStreamReader.close();  
  32.   
  33.         } catch (IOException e) {  
  34.             e.printStackTrace();  
  35.         }  
  36.     }  
  37.   
  38.     /** 
  39.      * 先解析: 
  40.      * "first": "mobile", 
  41.      * "second": "pc", 
  42.      * 也就是JSON的第一层嵌套; 
  43.      * 
  44.      * @param json 
  45.      */  
  46.     private void parseRoot(String json) {  
  47.         Gson gson = new Gson();  
  48.         Root root = gson.fromJson(json, Root.class);  
  49.         text.append(root.getFirst() + "\n");  
  50.         text.append(root.getSecond() + "\n");  
  51.     }  
  52.   
  53.     /** 
  54.      * 然后解析: 
  55.      * "app": { 
  56.      * "google": "android", 
  57.      * "apple": "iOS", 
  58.      * "microsoft": "wp" 
  59.      * } 
  60.      * 
  61.      * @param json 
  62.      */  
  63.     private void parseApp(String json) {  
  64.   
  65.         try {  
  66.             Gson gson = new Gson();  
  67.             JSONObject roo = new JSONObject(json);  
  68.             App app = gson.fromJson(roo.getString("app"), App.class);  
  69.             text.append(app.getGoogle() + "   " + app.getApple() + "   " + app.getMicrosoft() + "\n");  
  70.         } catch (JSONException e) {  
  71.             e.printStackTrace();  
  72.         }  
  73.     }  
  74.   
  75.     /** 
  76.      * 最后解析:也就是JSON数组。 
  77.      * "language": [ 
  78.      * { 
  79.      * "id": 1, 
  80.      * "name": "Java", 
  81.      * "ide": "Eclipse" 
  82.      * }, 
  83.      * { 
  84.      * "id": 2, 
  85.      * "name": "C++", 
  86.      * "ide": "Visual Studio" 
  87.      * } 
  88.      * ] 
  89.      * 
  90.      * @param json 
  91.      */  
  92.     private void parseLanguage(String json) {  
  93.   
  94.         try {  
  95.             Gson gson = new Gson();  
  96.             Type type = new TypeToken<ArrayList<Language>>() {  
  97.             }.getType();  
  98.             JSONObject roo = new JSONObject(json);  
  99.             ArrayList<Language> languages = gson.fromJson(roo.getString("language"), type);  
  100.   
  101.             for (int i = 0; i < languages.size(); i++) {  
  102.                 Language lan = languages.get(i);  
  103.                 text.append(lan.getId() + "   " + lan.getName() + "   " + lan.getIde() + "\n");  
  104.             }  
  105.         } catch (JSONException e) {  
  106.             e.printStackTrace();  
  107.         }  
  108.     }  
  109.   
  110.   
  111. }  


        程序实现的效果如下:

至此,已经成功实现用GSON解析较为复杂的JSON。


附GSON包下载:http://pan.baidu.com/s/1ntuxTRr


github主页:https://github.com/chenyufeng1991  。欢迎大家访问!

0 0
原创粉丝点击