一、概述

目前主流数据交换格式就是 Json和Xml,而 Json 格式使用范围可能更加的广并且可拓展性更强一些。
本文章将对 Json 数据交换格式通过 Gson 和 FastJson 来实现在 Android 端的高效解析。

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,用于数据转换传输。
通用于PHP, Java, C++, C#, Python等编程语言数据交换传输。
易于人阅读和编写,同时也易于机器解析和生成。
基本结构:对象、数组。

  1. Gson 的简介和特点:
    Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。
    可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。
    • 快速、高效
    • 代码量少、简洁
    • 面向对象
    • 数据传递和解析方便

    • 基本用法:
      • 定义实体类
      • 根据需要可以将JSON 生成单个实体或列表实体集合
    • 代码演示:
      使用 Gson 解析 JsonObject
      使用 Gson 解析 JsonArray
      使用 Gson 将实体转为JSON 数据
  2. FastJson 简介和特点:
    FastJson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。
    具有极快的性能,超越任其他的Java Json parser。
    • 快速FAST (比其它任何基于Java的解析器和生成器更快,包括jackson)
    • 强大(支持普通JDK类包括任意Java Bean Class、 Collection、 Map、 Date或enum )
    • 零依赖(没有依赖其它任何类库除了JDK)
    • 支持注解、支持全类型序列化

    • 基本用法:
      • 定义实体类
      • 根据需要可以将JSON 生成单个实体或列表实体集合
    • 代码演示:
      使用 FastJson 解析 JsonObject
      使用 FastJson 解析 JsonArray
      使用 FastJson 将实体转为JSON 数据

二、实例解析

1. Gson的基本用法

Gson有两个重要的方法,一个是 tojson(),另一个是 fromjson()

  • tojson() :将bean里面的内容转换为json内容。
User user=new User("zhangsan",19);Gson gson=new Gson();System.out.println(gson.toJson(user));//打印结果是{"name":"zhangsan","age":19}

当然它还可以承担一些复杂的操作,比如通过集合插入一组数据。

  List<User> list = new LinkedList<User>();  User u1 =new User("zhangsan",19);  list.add(u1);  User u2=new User("lisi",25);  list.add(u2);  Gson gson = new Gson();  System.out.println(gson.toJson(list));  //打印结果是[{"name":"zhangsan","age":19},{"name":"lisi","age":25}]  //注意,对于Json而言,[]代表数组,{}代表一个对象

当然它还可以实现更复杂的对象,比如在一个Json对象中再嵌套一个Json对象。

  • fromjson() :从我们的Json对象封装出一个一个的bean对象。
     User u = new User();     Gson gson = new Gson();     u = gson.fromJson("{name:'zhangsan',age:12}", user.class);     System.out.println(u.getName()+" "+u.getAge());     //打印结果是zhangsan 12

如果你的Json里面不止一个对象,那么你就得使用一个集合来装.
我们这里模拟一个list来装的例子,在使用list装的过程中我们会使用到一个工具类 TypeToken .
通过它我们可以 获取一个泛型的数据类型,使用方法十分简单,TypeToken<泛型>(){}.gettype()即可,返回一个Type类型,这就是fromjson()所需要的type类型,来自于reflect包

  User user = new User();  Gson gson = new Gson();  String str = "[{name:'zhangsan',age:12},{name:'lisi',age:13}]";  // 获取一个泛型的数据类型  Type type = new TypeToken<List<user>>(){}.getType();  List<user> list = gson.fromJson(str , type);  for(user u : list){      System.out.println(u.getName() + " " + u.getAge());  }  //打印结果是zhangsan 12  //lisi 13

2. Gson的实例解析

下面这段 json 代码(时间不一样获得的代码可能不一样)是豆瓣书籍的一个 api :
https://api.douban.com/v2/book/1220562

{    "rating": { "max": 10, "numRaters": 345, "average": "7.0", "min": 0 },     "subtitle": "",     "author": [ "[日] 片山恭一" ],     "pubdate": "2005-1",     "tags": [ { "count": 133, "name": "片山恭一", "title": "片山恭一" }, { "count": 62, "name": "日本", "title": "日本" }, { "count": 60, "name": "日本文学", "title": "日本文学" }, { "count": 38, "name": "小说", "title": "小说" }, { "count": 32, "name": "满月之夜白鲸现", "title": "满月之夜白鲸现" }, { "count": 15, "name": "爱情", "title": "爱情" }, { "count": 8, "name": "純愛", "title": "純愛" }, { "count": 8, "name": "外国文学", "title": "外国文学" } ],     "origin_title": "",     "image": "https://img1.doubanio.com/mpic/s1747553.jpg",     "binding": "平装",     "translator": [ "豫人" ],     "catalog": " ",     "pages": "180",     "images": { "small": "https://img1.doubanio.com/spic/s1747553.jpg", "large": "https://img1.doubanio.com/lpic/s1747553.jpg", "medium": "https://img1.doubanio.com/mpic/s1747553.jpg" },     "alt": "http://book.douban.com/subject/1220562/",     "id": "1220562",     "publisher": "青岛出版社",     "isbn10": "7543632608",     "isbn13": "9787543632608",     "title": "满月之夜白鲸现",     "url": "http://api.douban.com/v2/book/1220562",     "alt_title": "",     "author_intro": "",     "summary": "那一年,是听莫扎特、钓鲈鱼和家庭破裂的一年。说到家庭破裂,母亲怪自己当初没有找到好男人,父亲则认为当时是被狐狸精迷住了眼,失常的是母亲,但出问题的是父亲……。",     "price": "15.00元" }

下面我们在Android进行解析。
Project中总共有三个类:MainActivity.java , Book.java , Tag.java

public class MainActivity extends Activity {    private String url = "https://api.douban.com/v2/book/1220562";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        getData();    }    private void getData() {        StringRequest request = new StringRequest(url, new Listener<String>() {            @Override            public void onResponse(String arg0) {                Log.i("info", arg0);                dealData(arg0);            }        }, new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError arg0) {                // TODO Auto-generated method stub            }        });        // 将请求加入队列        new Volley().newRequestQueue(getApplicationContext()).add(request);    }    private void dealData(String result) {        Gson gson = new Gson();        Book book = gson.fromJson(result, Book.class);        Log.i("info", book.getTitle() + ":" + book.getPublisher() + ":"                + book.getTags().size()); // 这里打印了tags的个数    }}// Log日志结果是 满月之夜白鲸现:青岛出版社:8
// 对象的变量名要与json中的相对应,这里只是选取了json中的几个“变量”进行解析public class Book {    private String title;    private String publisher;    private String summary;    private ArrayList<Tag> tags;    public String getTitle() {        return title;    }    public void setTitle(String title) {        this.title = title;    }    public String getPublisher() {        return publisher;    }    public void setPublisher(String publisher) {        this.publisher = publisher;    }    public String getSummary() {        return summary;    }    public void setSummary(String summary) {        this.summary = summary;    }    public ArrayList<Tag> getTags() {        return tags;    }    public void setTags(ArrayList<Tag> tags) {        this.tags = tags;    }}
public class Tag {    private String count;    private String name;    private String title;    public String getCount() {        return count;    }    public void setCount(String count) {        this.count = count;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getTitle() {        return title;    }    public void setTitle(String title) {        this.title = title;    }}

3. FastJson的基本用法

1) Fastjson中的经常调用的方法
  // 把JSON文本parse为JSONObject或者JSONArray   public static final Object parse(String text);   // 把JSON文本parse成JSONObject   public static final JSONObject parseObject(String text);  // 把JSON文本parse为JavaBean   public static final  T parseObject(String text, Class clazz);   // 把JSON文本parse成JSONArray  public static final JSONArray parseArray(String text);    //把JSON文本parse成JavaBean集合   public static final  List parseArray(String text, Class clazz);   // 将JavaBean序列化为JSON文本  public static final String toJSONString(Object object);   // 将JavaBean序列化为带格式的JSON文本   public static final String toJSONString(Object object, boolean prettyFormat);   // 将JavaBean转换为JSONObject或者JSONArray。  public static final Object toJSON(Object javaObject); 

2) 如何使用FastJson

  • 服务器端使用Fastjson将数据转换成json字符串
    主要使用的函数如下:
public static String createJsonString(Object value){    String alibabaJson = JSON.toJSONString(value);//此处转换    return alibabaJson;}
  • 客户端将从服务器端获取到的json字符串转换为相应的javaBean,
    下面给以写核心的函数例子,供参考:
    public static String getJsonContent(String urlStr) {        try {              // 获取HttpURLConnection连接对象            URL url = new URL(urlStr);            HttpURLConnection httpConn = (HttpURLConnection) url                    .openConnection();            // 设置连接属性            httpConn.setConnectTimeout(3000);            httpConn.setDoInput(true);            httpConn.setRequestMethod("GET");            // 获取相应码            int respCode = httpConn.getResponseCode();            if (respCode == 200) {                return ConvertStream2Json(httpConn.getInputStream());            }        } catch (IOException e) {            e.printStackTrace();        }        return "";    }    private static String ConvertStream2Json(InputStream inputStream) throws IOException {        String jsonStr = "";        // ByteArrayOutputStream相当于内存输出流        ByteArrayOutputStream out = new ByteArrayOutputStream();        byte[] buffer = new byte[1024];        int len = 0;        // 将输入流转移到内存输出流中        while ((len = inputStream.read(buffer, 0, buffer.length)) != -1) {            out.write(buffer, 0, len);        }        // 将内存流转换为字符串        jsonStr = new String(out.toByteArray());        return jsonStr;    }

3) 使用泛型获取javaBean(核心函数)

  public static T getPerson(String jsonString, Class cls) {     T t = null;     t = JSON.parseObject(jsonString, cls);     return t;  }  public static List getPersons(String jsonString, Class cls) {     List list = new ArrayList();     list = JSON.parseArray(jsonString, cls);     return list;  }

4. FastJson的实例解析

只需在“Gson的实例解析中”修改dealData(String result)方法即可。

    private void dealData(String result) {        Book book = JSON.parseObject(result, Book.class);        List<Book> books = JSON.parseObject(result,                new TypeReference<List<Book>>() {                });        Book book1 = new Book();        book1.setTitle("biaoti");        Book book2 = new Book();        book2.setTitle("biaoti");        Book book3 = new Book();        book2.setTitle("biaoti");        List<Book> list = new ArrayList<Book>();        list.add(book1);        list.add(book2);        list.add(book3);        JSON.toJSON(list);        Log.i("info", book.getTitle() + ":" + book.getPublisher() + ":"                + book.getTags().size());    }

三、Gson的知识点补充

1. toJson()方法

toJson()方法用于将Java对象转换为相应的JSON数据,主要有以下几种形式:

  (1)String toJson(JsonElement jsonElement);  (2)String toJson(Object src);  (3)String toJson(Object src, Type typeOfSrc);

  其中,方法(1)用于将JsonElement对象(可以是JsonObject、JsonArray等)转换成JSON数据;
  方法(2)用于将指定的Object对象序列化成相应的JSON数据;
  方法(3)用于将指定的Object对象(可以包括泛型类型)序列化成相应的JSON数据。

2. fromJson()方法

fromJson()方法用于将JSON数据转换为相应的Java对象,主要有以下几种形式:

  (1)<T> T fromJson(JsonElement json, Class<T> classOfT);  (2)<T> T fromJson(JsonElement json, Type typeOfT);  (3)<T> T fromJson(JsonReader reader, Type typeOfT);  (4)<T> T fromJson(Reader reader, Class<T> classOfT);  (5)<T> T fromJson(Reader reader, Type typeOfT);  (6)<T> T fromJson(String json, Class<T> classOfT);  (7)<T> T fromJson(String json, Type typeOfT);

  以上的方法用于将不同形式的JSON数据解析成Java对象。

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. Android自定义控件系列九:从源码看Android触摸事件分发机制
  5. 条件数据库Android:sqllite的简单使用
  6. Android中ExpandableListView中嵌套ListView
  7. Android(安卓)AccessibilityService机制源码解析
  8. Android打造属于自己的数据库操作类。
  9. android 通过Application类 共享全局数据

随机推荐

  1. 关于android studio 出现Error:Execution
  2. android framework java层服务 分析
  3. Android动画之Interpolator
  4. Animation
  5. Android (Android Studio)(Java) 实现Vie
  6. Android(安卓)adb ubuntu 64bit 不能运行
  7. Android在全屏状态下键盘覆盖输入框问题
  8. 设置无标题&设置不显示状态栏
  9. Android 判断点是否在Path中(含不规则形
  10. Android 利用方向传感器实现 指南针