探讨JSON数据的使用和解析以及Google的Gson框架的使用

  • 理解JSON
  1. JSON是什么?
  • JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式
  • 本质就是具有特定格式的字符串
  • JSON数据已经是客户端与服务器端交互的最常用的选择, 已经很少使用xml来进行数据交互了

  2. JSON数据格式

  •  Json数组 : [ ] ,

    Json数组的结构: [value1, value2, value3]

  • Json对象: { }  ,

    Json对象的结构: {key1:value1, key2:value2, key3:value3}

  • key的数据类型: 字符串 ------- value的数据类型: 数值 字符串 null json数组 [] json对象 {}

 

  • JSON的解析

    1.第一种方式就是利用安卓原生的api进行解析

    有JSONObject和JSONArray两个类,分别对应JSON对象和JSON数组

    下面是两个类的一些api方法:

   ------------- JsonObject : json对象 { }

             JSONObject(String json) : 将json字符串解析为json对象

             Xxx getXxx(String name) : 根据name, 在json对象中得到对应的Value

 

   -------------   JsonArray : json数组 []

             JSONArray(String json) : 将json字符串解析为json数组

             int length() : 得到json数组中元素的个数

             Xxx getXxx(int index) : 根据下标得到json数组中对应的元素数据

    

    2.第二种方式就是利用Google提供的Gson的框架,这个框架使用非常方便,只需一行代码就可以将json数据解析成一个javabean对象或者

     将json数组数据解析成一个List集合。Gson框架不仅可以解析json数据,还可将List集合对象和javabean对象转换成一段json字符串数据。

     Gson框架中有一个Gson类,这个类中有个重要的方法:

 

     String toJson(Object src) 

     String toJson(Object src ,Type typeOfT) :将对象转换为对应格式的json字符串

 

 

     T fromJson(String json, Type typeOfT) 

     T formJson(String json,Class<T> clazz): 解析Json字符串, 得到对象

     下面就来探讨下Gson的使用:

     1).首先将json格式的字符串{}转换为JavaBean对象

    public void testJsonToObjectByGson() throws Exception {
        String jsonString = "{\"id\":2, \"name\":\"大虾\", \"price\":12.3,\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f1.jpg\"}";
        ProdInfo info = new Gson().fromJson(jsonString, ProdInfo.class);
        System.out.println(info);
    }

      可以看到,要将json格式的字符串{}转换为JavaBean对象,要调用Gson的T fromJson(String json, Class<T> clazz) 方法,第一个参数是json数据字符串,第二个参数是JavaBean的字节码对象

     2).将json格式的字符串[]转换为JavaBean对象的List

public void testJsonToListByGson() throws Exception {
        String jsonString = "[{\"id\":3, \"name\":\"大虾\", \"price\":12.3,\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f1.jpg\"},"
                + "{\"id\":5, \"name\":\"大虾2\", \"price\":128.3,\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f2.jpg\"}]";
        List<ProdInfo> list = new ArrayList<ProdInfo>();
        list=new Gson().fromJson(jsonString,new TypeToken<List<ProdInfo>>(){}.getType());
        System.out.println(list);
    }

      可以看到,要将json格式的字符串[]转换为Java对象的List,要调用Gson的T fromJson(String json, Type typeOfT) 方法,第一个参数是json数据字符串,第二个参数是List<JavaBean>的对应的Type对象

      这里的难点就是这个Type对象如何获取,很幸运的是Gson已经封装好方法给我们去获取Type对象,就是通过TypeToken类来的getType()方法来获取,而因为TypeToken的构造方法是protected的,所以需要这样

      来调用new TypeToken<List<ProdInfo>>(){}.getType()。看到这里有人可能会问为什么不用T fromJson(String json, Class<T> clazz) 这个方法,其实也可以,就是获取List<JavaBean>的字节码对象比较麻烦。

     3).将JavaBean对象转换为json字符串{}

ProdInfo info=new ProdInfo(3,"大虾", 12.3, "http://192.168.10.165:8080/L05_Server/images/f1.jpg");
        String jsonString=new Gson().toJson(info);
        System.out.println(jsonString);

     4).将JavaBean对象的List转换为json字符串[]

ProdInfo info1=new ProdInfo(3,"大虾", 12.3, "http://192.168.10.165:8080/L05_Server/images/f1.jpg");
        ProdInfo info2=new ProdInfo(4,"大虾", 12.4, "http://192.168.10.165:8080/L05_Server/images/f2.jpg");
        List<ProdInfo> list=new ArrayList<ProdInfo>();
        list.add(info1);
        list.add(info2);

      //String jsonString=new Gson().toJson(list, new TypeToken<List<ProdInfo>>(){}.getType());
      String jsonString=new Gson().toJson(list);


        System.out.println(jsonString);

    可以通过两个方法来转换,这里的Type对象的获取跟上面的一样这里就不多说了

  

 

 

作者表达能力有限,可能会误导你们,希望你们见谅。如果实在看不懂,可以通过测试代码调试来理解。。。。

posted on 2016-08-07 15:18  JsAko飞得更远  阅读(1381)  评论(0)    收藏  举报

导航