灵活组装Json的数据使用Gson的JsonParser和JsonReader解析Json详解例子


  1. package
     com.app.json;    
  2.     
  3. import java.util.ArrayList;  
  4. import java.util.Iterator;  
  5. import java.util.List;  
  6.   
  7. import net.sf.json.JSONArray;  
  8.   
  9. import com.app.entity.duapp.Address;  
  10. import com.google.gson.Gson;  
  11. import com.google.gson.JsonArray;  
  12. import com.google.gson.JsonElement;  
  13. import com.google.gson.JsonObject;  
  14. import com.google.gson.JsonParser;  
  15.   
  16. /** 
  17.  *@DEMO:napp 
  18.  *@Author:jilongliang 
  19.  *@Date:2013-7-20 
  20.  */  
  21. public class JsonParse {    
  22.     private static Gson gson=new Gson();  
  23.     /** 
  24.      * 通过JsonLib把数组转换成Json数据 
  25.      * @param url 
  26.      * @throws Exception 
  27.      */  
  28.     private static JSONArray getArrayToJsonByJsonLib()throws Exception  
  29.     {  
  30.         JSONArray jsonArr=null;  
  31.         List<Address> lists=new ArrayList<Address>();  
  32.         for (int i = 1; i <=12; i++) {  
  33.             Address addr = new Address();   
  34.             addr.setProvince("第"+i+"个省份");  
  35.             addr.setCity("第"+i+"个城市");  
  36.             addr.setCityCode("130"+i);  
  37.             addr.setStreet("街道"+i);  
  38.             addr.setStreetNumber("街道号码"+i);  
  39.             lists.add(addr);  
  40.         }  
  41.         jsonArr = JSONArray.fromObject(lists);  //把对象转换成Json对象  
  42.         return jsonArr;  
  43.     }  
  44.       
  45.     public static void main(String[] args)throws Exception{  
  46.         getJsonGson();   
  47.           
  48.     }  
  49.       
  50.     /** 
  51.      * 利用Json-lib封装数组Json数据,Gson解析Json数据. 
  52.      * @throws Exception 
  53.      */  
  54.     private static void getJsonGson() throws Exception {  
  55.         //Json-lib的JSONArray数组对象  
  56.         JSONArray  JsonArray =getArrayToJsonByJsonLib();  
  57.         String jsonData=JsonArray.toString();  
  58.         /* 
  59.          * 自己组装成一个json格式,格式必须为{,,}才能为JsonElement对象的parse方法解析不是否则 
  60.          * 会报错com.google.gson.JsonSyntaxException: java.io.EOFException: End of input at line 1 column 1307 
  61.          */  
  62.         String json="{status:1,address:"+jsonData+"}";  
  63.   
  64.         // 创建一个JsonParser  
  65.         JsonParser parser = new JsonParser();  
  66.         JsonElement jsonEl = parser.parse(json);  
  67.           
  68.         JsonObject jsonObj = null;  
  69.         jsonObj = jsonEl.getAsJsonObject();//转换成Json对象  
  70.         String status=jsonObj.get("status").getAsString();//status节点  
  71.         //System.out.println(status);  
  72.           
  73.         JsonElement addressEl=jsonObj.get("address");//address节点  
  74.         if(addressEl.isJsonArray()){//判断是否为Json数组  
  75.             JsonArray jsonArray= addressEl.getAsJsonArray();//转为数组  
  76.             for(Iterator iter=jsonArray.iterator();iter.hasNext();){  
  77.                 JsonObject obj=(JsonObject) iter.next();  
  78.                 //String city=obj.get("city").getAsString();//方法一:根据key形势取值  
  79.                 Address add=gson.fromJson(obj, Address.class);//方法二:灵活使用Gson取数据  
  80.                 System.out.println(add.getProvince()+"\t"+add.getCity());  
  81.              }  
  82.         }  
  83.     }  
  84.        
  85.  }   

 json数据是由运行JsonRead类可以生成

Java代码   收藏代码
  1. {  
  2.     "info":  
  3.     {  
  4.         "users":{"username":"liangjilong","email":"jilongliang@sina.com","tel":"12396878","age":"25"},  
  5.         "address":{"street":"棠东","province":"广东省","district":"天河区","city":"广州市"}  
  6.     }  
  7. }  

 JsonRead

Java代码   收藏代码
  1. package com.app.json;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.io.StringReader;  
  6. import java.util.HashMap;  
  7. import java.util.Map;  
  8.   
  9. import com.google.gson.Gson;  
  10. import com.google.gson.stream.JsonReader;  
  11.   
  12. /** 
  13.  *@DEMO:napp 
  14.  *@Author:jilongliang 
  15.  *@Date:2013-7-20 
  16.  */  
  17. public class JsonRead {  
  18.     private static Gson gson=new Gson();  
  19.     /** 
  20.      * @param args 
  21.      */  
  22.     public static void main(String[] args) throws Exception{  
  23.          getJsonData();  
  24.            
  25.         //方法二  
  26.         //String pathname="src/config/doc/json";  
  27.         //InputStream input = new FileInputStream(new File(pathname));  
  28.         //readJsonData(input,null);  
  29.     }  
  30.     /** 
  31.      * 组装Json数据 
  32.      * @throws Exception 
  33.      */  
  34.     private static void getJsonData() throws Exception {  
  35.         /** 
  36.           * 组装address对象的数据 
  37.           */  
  38.          Map<String, String> address = new HashMap <String, String>();   
  39.          address.put("province""广东省");  
  40.          address.put("city""广州市");  
  41.          address.put("district""天河区");  
  42.          address.put("street""棠东");   
  43.          /** 
  44.           * 组装users对象的数据 
  45.           */  
  46.          Map<String, String> users = new HashMap <String, String>();   
  47.          users.put("username""liangjilong");  
  48.          users.put("age""25");  
  49.          users.put("tel""12396878");  
  50.          users.put("email""jilongliang@sina.com");   
  51.            
  52.          Map<Object, Object> listsObj = new HashMap <Object, Object>();   
  53.          listsObj.put("address",address);//address节点  
  54.          listsObj.put("users",users);//users节点  
  55.            
  56.          Object obj=listsObj;//转换成对象  
  57.            
  58.          Map<Object, Object> info = new HashMap <Object, Object>();   
  59.          info.put("info", obj);//json的根节点  
  60.            
  61.            
  62.          String json=gson.toJson(info);//转换成json数据  
  63.          System.out.println(json);//打印json数据  
  64.          readJsonData(null,json);  
  65.     }  
  66.     /** 
  67.      * 从文件读取json数据 
  68.      * @param in 
  69.      * @throws Exception 
  70.      */  
  71.     public static void readJsonData(InputStream in,String json) throws Exception {  
  72.         //JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));  
  73.         JsonReader reader = new JsonReader(new StringReader(json));  
  74.         try {  
  75.             reader.beginObject();  
  76.             String tagName = reader.nextName();  
  77.             if (tagName.equals("info")) {  
  78.                 readInfo(reader);  
  79.             }  
  80.             reader.endObject();  
  81.         } finally {  
  82.             reader.close();  
  83.         }  
  84.     }  
  85.     /** 
  86.      * 读取json的父(根,第一个)节点 
  87.      * @param reader 
  88.      * @throws Exception 
  89.      */  
  90.     public static void readInfo(JsonReader reader) throws Exception {  
  91.         reader.beginObject();  
  92.         while (reader.hasNext()) {  
  93.             String tagName = reader.nextName();  
  94.             if (tagName.equals("address")) {  
  95.                 readAddress(reader);  
  96.             } else if (tagName.equals("users")) {  
  97.                 readUsers(reader);  
  98.             }   
  99.         }  
  100.         reader.endObject();  
  101.     }  
  102.     /** 
  103.      * 读取用户信息值 
  104.      * @param reader 
  105.      * @throws IOException 
  106.      */  
  107.     public static void readUsers(JsonReader reader) throws IOException {  
  108.         reader.beginObject();  
  109.         while (reader.hasNext()) {  
  110.             String tag = reader.nextName();  
  111.             if (tag.equals("username")) {  
  112.                 String username = reader.nextString();  
  113.                 System.out.println("用户名:" + username);  
  114.             } else if (tag.equals("email")) {  
  115.                 String email = reader.nextString();  
  116.                 System.out.println("Email:" + email);  
  117.             } else if (tag.equals("tel")) {  
  118.                 String tel = reader.nextString();  
  119.                 System.out.println("电话:" + tel);  
  120.             }else if (tag.equals("age")) {  
  121.                 String age = reader.nextString();  
  122.                 System.out.println("年龄:" + age);  
  123.             } else {  
  124.                 reader.skipValue();//忽略值/跳过break  
  125.             }  
  126.         }  
  127.         reader.endObject();  
  128.     }  
  129.     /** 
  130.      * 读取地区值 
  131.      * @param reader 
  132.      * @throws IOException 
  133.      */  
  134.     public static void readAddress(JsonReader reader) throws IOException {  
  135.         reader.beginObject();  
  136.         while (reader.hasNext()) {  
  137.             String tag = reader.nextName();  
  138.             if (tag.equals("province")) {  
  139.                 String province = reader.nextString();  
  140.                 System.out.println("省份:" + province);  
  141.             } else if (tag.equals("city")) {  
  142.                 String city = reader.nextString();  
  143.                 System.out.println("街道:" + city);  
  144.             } else if (tag.equals("street")) {  
  145.                 String street = reader.nextString();  
  146.                 System.out.println("街道:" + street);  
  147.             }else if (tag.equals("district")) {  
  148.                 String district = reader.nextString();  
  149.                 System.out.println("区:" + district);  
  150.             } else {  
  151.                 reader.skipValue();//忽略值/跳过break  
  152.             }  
  153.         }  
  154.         reader.endObject();  
  155.     }  
  156. }  

JsonObject jsonObject = new JsonParser().parse(mGsonString).getAsJsonObject();
String title = jsonObject.get("title").getAsString();
String my_ip_ = jsonObject.get("my_ip_").getAsString();
int recode = jsonObject.get("retcode_").getAsInt();
Log.d("mytest","title=" + title);
Log.d("mytest","my_ip_=" + my_ip_);
Log.d("mytest","recode=" + recode);

Gson gson = new Gson();

JsonObject data = jsonObject.get("data").getAsJsonObject();
Set<Entry<String, JsonElement>> entrySet =  data.entrySet();
for(Entry<String, JsonElement> type : entrySet){
    JsonObject obj = data.getAsJsonObject(type.getKey());
    ContactRoom cr = gson.fromJson(obj,ContactRoom.class);
    Log.d("mytest","type.getKey()=" + type.getKey());
    Log.d("mytest","cr=" + cr.name + ":" + cr.svr_guid + ":" + cr.member);
}

 实体类:

Java代码   收藏代码
  1. package com.app.entity.duapp;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import com.google.gson.annotations.Expose;  
  6. /** 
  7.  * 使用 new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); 
  8.  * 创建Gson对象,没有@Expose注释的属性将不会被序列化 
  9.  * serialize序列化 默认 true 
  10.  * deserialize反序列化 默认 true 
  11.  * 
  12.  */  
  13. public class Address implements Serializable{  
  14.     @Expose(serialize=false)// 序列化  /类已经序列化  
  15.     private String streetNumber;  
  16.     @Expose(deserialize=false)// 反序列化  
  17.     private String street;  
  18.     private String district;  
  19.     private String city;  
  20.     private String province;  
  21.     private String cityCode;  
  22.     public String getCityCode() {  
  23.         return cityCode;  
  24.     }  
  25.     public void setCityCode(String cityCode) {  
  26.         this.cityCode = cityCode;  
  27.     }  
  28.     public String getStreetNumber() {  
  29.         return streetNumber;  
  30.     }  
  31.     public void setStreetNumber(String streetNumber) {  
  32.         this.streetNumber = streetNumber;  
  33.     }  
  34.     public String getStreet() {  
  35.         return street;  
  36.     }  
  37.     public void setStreet(String street) {  
  38.         this.street = street;  
  39.     }  
  40.     public String getDistrict() {  
  41.         return district;  
  42.     }  
  43.     public void setDistrict(String district) {  
  44.         this.district = district;  
  45.     }  
  46.     public String getCity() {  
  47.         return city;  
  48.     }  
  49.     public void setCity(String city) {  
  50.         this.city = city;  
  51.     }  
  52.     public String getProvince() {  
  53.         return province;  
  54.     }  
  55.     public void setProvince(String province) {  
  56.         this.province = province;  
  57.     }  
  58.       
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Gson 是 Google 提供的一个用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库,它可以将 JSON 字符串转换为 Java 对象,也可以将 Java 对象转换为 JSON 字符串。下面是使用 Gson解析 JSON 数据的示例代码: 1. 添加 GSON 依赖 在项目的 build.gradle 文件中添加以下依赖: ```groovy dependencies { // ... implementation 'com.google.code.gson:gson:2.8.6' // ... } ``` 2. 定义 Java 类 首先,我们需要定义一个 Java 类来表示 JSON 数据的结构。假设我们要解析JSON 数据格式如下: ```json { "name": "张三", "age": 20, "isMale": true } ``` 那么,我们可以定义一个对应的 Java 类: ```java public class Person { private String name; private int age; private boolean isMale; // 构造函数、getters 和 setters 略 // ... } ``` 3. 解析 JSON 数据 接下来,我们可以使用 Gson 类的`fromJson()`方法将 JSON 字符串转换为 Java 对象。示例代码如下: ```java String jsonData = "{\"name\":\"张三\",\"age\":20,\"isMale\":true}"; // 替换成你要解析JSON 数据 Gson gson = new Gson(); Person person = gson.fromJson(jsonData, Person.class); ``` 以上代码中,`fromJson()`方法的第一个参数是要解析JSON 字符串,第二个参数是要转换为的 Java 类的类型。Gson 会自动将 JSON 中的字段映射到 Java 对象的属性中。 现在,`person`对象中就包含了从 JSON 字符串中解析出来的数据。我们可以通过调用`person.getName()`、`person.getAge()`等方法获取属性的值。 注意:使用 Gson 解析 JSON 数据的前提是,JSON 字符串的字段名要与 Java 对象的属性名匹配。如果不匹配,需要通过`@SerializedName`注解或`FieldNamingStrategy`接口来指定对应关系。具体使用方法可以参考 Gson 的文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值