Android中的JSON解析方式:json; Gson ; Fastjson

本文主要介绍Json数据的解析
----a,json数据的介绍
----b,json数据的解析
----c,gson数据的解析,谷歌公司的一种格式
----d,fastjson数据的解析,阿里巴巴的一种格式

通过本文的学习能掌握json数据格式的解析,为以后json格式数据的解析做到熟练于心。


Json的全称:JavaScript Object Notation

JSON的定义:
       一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。 – Json.org


Json建构于两种结构:
“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。 
值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)



JSON对象是一个无序的“‘名称/值’对”集合。
一个对象以“{”(左括号)开始,“}”(右括号)结束。
每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
如:      {
“name”:”jackson”,
    “age”:100
    }

数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔
如:{
“students”:
[
{“name”:”jackson”,“age”:100},
{“name”:”michael”,”age”:51}
]
    }


一。谷歌GSON技术的介绍

Gson这个Java类库可以把Java对象转换成JSON,也可以把JSON字符串转换成一个相等的Java对象。


Gson支持任意复杂Java对象包括没有源代码的对象。


二。阿里巴巴FastJson技术的介绍

FastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:

速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser。包括自称最快的JackJson。

功能强大,完全支持Java Bean、集合、Map、日期、Enum,支持范型,支持自省。

无依赖,能够直接运行在Java SE 5.0以上版本

支持Android。

开源 (Apache 2.0)


三。JSON Vs XML
1.JSON和XML的数据可读性基本相同

2.JSON和XML同样拥有丰富的解析手段

3.JSON相对于XML来讲,数据的体积小

4.JSON与JavaScript的交互更加方便

5.JSON对数据的描述性比XML较差

6.JSON的速度要远远快于XML 


四。android2.3提供的json解析类 

android的json解析部分都在包org.json下,主要有以下几个类: 

JSONObject:可以看作是一个json对象,这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值。它对外部(External:   应用toString()方法输出的数值)调用的响应体现为一个标准的字符串(例如:{"JSON": "Hello, World"},最外被大括号包裹,其中的KeyValue被冒号":"分隔)。其对于内部(Internal)行为的操作格式略微,例如:初始化一个JSONObject实例,引用内部的put()方法添加数值:new JSONObject().put("JSON", "Hello, World!"),在KeyValue之间是以逗号","分隔。Value的类型包括:BooleanJSONArrayJSONObjectNumberString或者默认值JSONObject.NULL object 。

JSONStringer:json文本构建类 ,根据官方的解释,这个类可以帮助快速和便捷的创建JSON text。其最大的优点在于可以减少由于 格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。。其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。

JSONArray它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如:     [value1,value2,value3],大家可以亲自利用简短的代码更加直观的了解其格式)。这个类的内部同样具有查询行为,     get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值。同样这个类的value类型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。

JSONTokener:json解析类 
JSONException:json中用到的异常 

首先建立一个公共的Bean


[java]  view plain copy
  1. package com.qianfeng.domain;  
  2.   
  3. public class Person {  
  4.   
  5.     private int age;  
  6.     private String name;  
  7.   
  8.     public Person(int age, String name) {  
  9.         super();  
  10.         this.age = age;  
  11.         this.name = name;  
  12.     }  
  13.     @Override  
  14.     public String toString() {  
  15.         return "Person [age=" + age + ", name=" + name + "]";  
  16.     }  
  17.   
  18.     public int getAge() {  
  19.         return age;  
  20.     }  
  21.   
  22.     public void setAge(int age) {  
  23.         this.age = age;  
  24.     }  
  25.   
  26.     public String getName() {  
  27.         return name;  
  28.     }  
  29.   
  30.     public void setName(String name) {  
  31.         this.name = name;  
  32.     }  
  33.   
  34.     public Person() {  
  35.         // TODO Auto-generated constructor stub  
  36.     }  
  37.   
  38. }  



第一种方式:

Json方式:


[java]  view plain copy
  1. public class JsonList {  
  2.   
  3.     public JsonList() {  
  4.         // TODO Auto-generated constructor stub  
  5.     }  
  6.   
  7.     public static List<Person> getList() {  
  8.         List<Person> list = new ArrayList<Person>();  
  9.         list.add(new Person(1002,"李四2"));  
  10.         list.add(new Person(1003,"李四3"));  
  11.         list.add(new Person(1001,"李四1"));  
  12.         return list;  
  13.     }  
  14.     public static Person getPerson(){  
  15.         return new Person(1002,"李四2");   
  16.     }  
  17. }  



[java]  view plain copy
  1. import net.sf.json.JSON;  
  2. import net.sf.json.JSONArray;  
  3. import net.sf.json.JSONObject;  
  4. import net.sf.json.JSONSerializer;  
  5.   
  6. public class JsonTools {  
  7.   
  8.     public JsonTools() {  
  9.         // TODO Auto-generated constructor stub  
  10.     }  
  11.   
  12.     public static String getString(Person person) {  
  13.         JSON json = JSONSerializer.toJSON(JsonList.getPerson());  
  14.         return json.toString();  
  15.     }  
  16.   
  17.     /** 
  18.      *  
  19.      * @param msgString 
  20.      * @return 
  21.      */  
  22.     public static Person getPerson(String msgString) {  
  23.         Person person = new Person();  
  24.         JSONArray array = new JSONArray();  
  25.         array.add(msgString);  
  26.         JSONObject obj = array.getJSONObject(0);  
  27.         // System.out.println(obj.get("age"));  
  28.         // System.out.println(obj.get("name"));  
  29.         person.setAge(obj.getInt("age"));  
  30.         person.setName(obj.getString("name"));  
  31.         return person;  
  32.     }  
  33.   
  34.     public static String getListString(List<Person> listPersons) {  
  35.         JSON json = JSONSerializer.toJSON(listPersons);  
  36.         return json.toString();  
  37.     }  
  38.   
  39.       
  40.     /** 
  41.      * 将一个json格式的字符串转换成行对应的对象 
  42.      * @param str 
  43.      * @return 
  44.      */  
  45.     public static List<Person> getPersons(String str) {  
  46.         List<Person> list = new ArrayList<Person>();  
  47.         JSONArray array = new JSONArray();  
  48.         array.add(str);  
  49.         JSONArray array2 = array.getJSONArray(0);  
  50.         for (int i = 0; i <array2.size(); i++) {  
  51.             JSONObject jsonObject =  array2.getJSONObject(i);  
  52.             Person person = new Person();  
  53.             person.setAge(jsonObject.getInt("age"));  
  54.             person.setName(jsonObject.getString("name"));  
  55.             list.add(person);  
  56.         }  
  57.         return list;  
  58.     }  
  59.     /** 
  60.      * @param args 
  61.      */  
  62.     public static void main(String[] args) {  
  63.         // TODO Auto-generated method stub  
  64.         // JSON json = JSONSerializer.toJSON(JsonList.getList());  
  65.         // System.out.println(getString(new Person(23,"jack")));  
  66.         // System.out.println(getPerson("{'age':1002,'name':'李四2'}").toString());  
  67.         // System.out.println(getListString(JsonList.getList()));  
  68.         String msgString = "[{'age':1002,'name':'李四2'},{'age':1003,'name':'李四3'},{'age':1001,'name':'李四1'}]";  
  69.         List<Person> lPersons = getPersons(msgString);  
  70.         for(Person p:lPersons){  
  71.             System.out.println(p.toString());  
  72.         }  
  73.     }  
  74. }  




第二种方式:

Gson方式


[java]  view plain copy
  1. import java.util.ArrayList;  
  2. import java.util.HashMap;  
  3. import java.util.List;  
  4. import java.util.Map;  
  5. import com.android.domain.Person;  
  6. import com.google.gson.Gson;  
  7. import com.google.gson.reflect.TypeToken;  
  8.   
  9. public class GsonTools {  
  10.   
  11.     public GsonTools() {  
  12.         // TODO Auto-generated constructor stub  
  13.     }  
  14.   
  15.     public static String createGsonString(Object object) {  
  16.         Gson gson = new Gson();  
  17.         String gsonString = gson.toJson(object);  
  18.         return gsonString;  
  19.     }  
  20.   
  21.     public static <T> T changeGsonToBean(String gsonString, Class<T> cls) {  
  22.         Gson gson = new Gson();  
  23.         T t = gson.fromJson(gsonString, cls);  
  24.         return t;  
  25.     }  
  26.   
  27.     public static <T> List<T> changeGsonToList(String gsonString, Class<T> cls) {  
  28.         Gson gson = new Gson();  
  29.         List<T> list_person = gson.fromJson(gsonString,  
  30.                 new TypeToken<List<T>>() {  
  31.                 }.getType());  
  32.         return list_person;  
  33.     }  
  34.   
  35.     public static List<Map<String, Object>> changeGsonToListMaps(String gsonString) {  
  36.         List<Map<String, Object>> list = null;  
  37.         Gson gson = new Gson();  
  38.         list = gson.fromJson(gsonString,  
  39.                 new TypeToken<List<Map<String, Object>>>() {  
  40.                 }.getType());  
  41.         return list;  
  42.     }  
  43.   
  44.     /** 
  45.      * @param args 
  46.      */  
  47.     public static void main(String[] args) {  
  48.         // TODO Auto-generated method stub  
  49.         // Person person1 = new Person("张三1", 24, "北京1");  
  50.         // Person person2 = new Person("张三2", 23, "北京2");  
  51.         // List<Person> list = new ArrayList<Person>();  
  52.         // list.add(person1);  
  53.         // list.add(person2);  
  54.         //  
  55.         // String gsonString = createGsonString(list);  
  56.         // System.out.println(gsonString);  
  57.         // Gson gson = new Gson();  
  58.         // List<Person> list_person = changeGsonToList(gsonString,Person.class);  
  59.         // System.out.println(list_person.toString());  
  60.         // Person pp = changeGsonToBean(gsonString,Person.class);  
  61.         // System.out.println(pp);  
  62.         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
  63.         Map<String, Object> map = new HashMap<String, Object>();  
  64.         map.put("name""jack");  
  65.         map.put("age"23);  
  66.         Map<String, Object> map2 = new HashMap<String, Object>();  
  67.         map2.put("name""rose");  
  68.         map2.put("age"24);  
  69.         list.add(map);  
  70.         list.add(map2);  
  71.         String gsonString = createGsonString(list);  
  72.         System.out.println(gsonString);  
  73.         List<Map<String, Object>> list2 = changeGsonToListMaps(gsonString);  
  74.         System.out.println(list2.toString());  
  75.     }  
  76.   
  77. }  







第三种方式:

fastJosn方式


[java]  view plain copy
  1. import java.util.ArrayList;  
  2. import java.util.HashMap;  
  3. import java.util.List;  
  4. import java.util.Map;  
  5.   
  6. import com.alibaba.fastjson.JSON;  
  7. import com.alibaba.fastjson.TypeReference;  
  8. import com.alibaba.fastjson.asm.Type;  
  9. import com.alibaba.fastjson.util.TypeUtils;  
  10.   
  11. public class FastJsonTools {  
  12.   
  13.     public FastJsonTools() {  
  14.         // TODO Auto-generated constructor stub  
  15.     }  
  16.   
  17.     public static String createJsonString(Object object) {  
  18.         String jsonString = JSON.toJSONString(object);  
  19.         return jsonString;  
  20.     }  
  21.   
  22.     public static <T> T createJsonBean(String jsonString, Class<T> cls) {  
  23.         T t = JSON.parseObject(jsonString, cls);  
  24.         return t;  
  25.     }  
  26.   
  27.     public static <T> List<T> createJsonToListBean(String jsonString,  
  28.             Class<T> cls) {  
  29.         List<T> list = null;  
  30.         list = JSON.parseArray(jsonString, cls);  
  31.         return list;  
  32.     }  
  33.   
  34.     /** 
  35.      * @param jsonString 
  36.      * @return 
  37.      */  
  38.     public static List<Map<String, Object>> createJsonToListMap(  
  39.             String jsonString) {  
  40.         List<Map<String, Object>> list2 = JSON.parseObject(jsonString,  
  41.                 new TypeReference<List<Map<String, Object>>>() {  
  42.                 });  
  43.         return list2;  
  44.     }  
  45.   
  46.     /** 
  47.      * @param args 
  48.      */  
  49.     public static void main(String[] args) {  
  50.         // TODO Auto-generated method stub  
  51.         // Person person1 = new Person("张三1", 24, "北京1");  
  52.         // Person person2 = new Person("张三2", 23, "北京2");  
  53.         // List<Person> list = new ArrayList<Person>();  
  54.         // list.add(person1);  
  55.         // list.add(person2);  
  56.         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
  57.         Map<String, Object> map = new HashMap<String, Object>();  
  58.         map.put("name""jack");  
  59.         map.put("age"23);  
  60.         Map<String, Object> map2 = new HashMap<String, Object>();  
  61.         map2.put("name""rose");  
  62.         map2.put("age"24);  
  63.         list.add(map);  
  64.         list.add(map2);  
  65.   
  66.         String jsonString = JSON.toJSONString(list);  
  67.         System.out.println(jsonString);  
  68.         // JSON.parseArray(arg0, arg1)  
  69.         List<Map<String, Object>> list2 = JSON.parseObject(jsonString,  
  70.                 new TypeReference<List<Map<String, Object>>>() {  
  71.                 });  
  72.         // List<Person> lists = JSON.parseArray(arg0, arg1);  
  73.         System.out.println(list2.toString());  
  74.   
  75.     }  
  76.   
  77. }  



示例下载


示例下载


参考网址

json官网

google-gson


博客一




=======================================================================================================================

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000


[java]  view plain copy
  1. /**   
  2.          * 获取"数组形式"的JSON数据,   
  3.          * @param path  网页路径   
  4.          * @return  返回JSONArray   
  5.          * @throws Exception   
  6.           */    
  7.         public static String getJSONArray(String path) throws Exception {  
  8.                 String json = null;  
  9.                 URL url = new URL(path);  
  10.                 // 利用HttpURLConnection对象,我们可以从网络中获取网页数据.  
  11.                 HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
  12.                 // 单位是毫秒,设置超时时间为5秒  
  13.                 conn.setConnectTimeout(5 * 1000);   
  14.                 // HttpURLConnection是通过HTTP协议请求path路径的,所以需要设置请求方式,可以不设置,因为默认为GET  
  15.                 conn.setRequestMethod("GET");   
  16.                 if (conn.getResponseCode() == 200) {// 判断请求码是否是200码,否则失败  
  17.                           
  18.                         InputStream is = conn.getInputStream(); // 获取输入流  
  19.                         byte[] data = readStream(is); // 把输入流转换成字符数组  
  20.                         json = new String(data); // 把字符数组转换成字符串  
  21. //                        JSONArray jsonArray = new JSONArray(json);// 用android提供的框架JSONArray读取JSON数据,转换成Array  
  22.                 }  
  23.                 return json;  
  24.         }  



该方法返回解析到的json数据(例:[{"ID":11,"uid":67,"carNo":"豫A000V1"},{"ID":12,"uid":67,"carNo":"豫A9E592"},{"ID":16,"uid":67,"carNo":"豫A1E238"}])
然后就可以解析你想要的字段了


[java]  view plain copy
  1. JSONArray jsonArray = new JSONArray(carIdJSON);  
  2.                                         for (int i = 0; i < jsonArray.length(); i++) {  
  3.                                                 JSONObject jsonObject = jsonArray.getJSONObject(i);  
  4.     jsonObject.getString("carNo");  
  5.     jsonObject.getString("ID");  
  6.   
  7.                                         }  

有解析就有上传了(POST上传),json的上传要用NameValuePairs,大家可以查看jdk关于NameValuePairs的解释
NameValuePairs只能传String类型的值


  1. nameValuePairs.add(new BasicNameValuePair("xxx", xxx));
复制代码
可以上传很多字段(按需求上传就行了)


下面就是上传的方法
  1. //        1. 使用POST方式时,传递参数必须使用NameValuePair数组
  2. //        2. 使用GET方式时,通过URL传递参数,注意写法
  3. //        3. 通过setEntity方法来发送HTTP请求
  4. //        4. 通过DefaultHttpClient 的 execute方法来获取HttpResponse
  5. //        5. 通过getEntity()从Response中获取内容
  6.         
  7.         
  8.         public static int httpPostData(String urlString,List<NameValuePair> nameValuePairs){
  9.                 
  10.                 HttpClient httpclient = new DefaultHttpClient();
  11.                 HttpPost httppost = new HttpPost(urlString);
  12.                 try{
  13.                         httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
  14.                         HttpResponse response = httpclient.execute(httppost);
  15.                         int statusCode = response.getStatusLine().getStatusCode();
  16.                         return statusCode;
  17.                 }catch(Exception e){
  18.                         e.printStackTrace();
  19.                 }
  20.                 return 0;

  21.         }
复制代码
方法返回请求服务器,返回的响应参数
200成功
200服务器出错
404服务器没响应(服务器有问题)


http://www.eoeandroid.com/forum.php?mod=viewthread&tid=165428&reltid=227908&pre_thread_id=0&pre_pos=2&ext=CB

http://www.eoeandroid.com/forum.php?mod=viewthread&tid=276713

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值