Android中重要数据解析JSON工具之gson库的使用

  • 1、在进行Android的开发过程中,我们少不了要与后台进行数据的交互以及解析相应的数据信息,也就是我们常说的JSON(数据进行交换的一种格式)的数据。JSON(JavaScript Object Notation)其实是一种轻量级(轻量级、简单、易操作、快捷)的数据交换格式(本质上就是具有特殊格式的字符串)。主要目的就是给出一套通用的数据格式,大家按照这种格式定义自己的数据,方便数据的存储和交换。特点是(相对来说)易于人阅读和编写,易于一写工具的解析和生成。
  • 2、JSON的格式:主要就是json数组([xxx])和json对象({xxx});数组的结构应该很简单的,就是存一些实时需要的字段,那对象则是也集合的方式存储也就是key、value的形式,而json对象中的key是String形式的,而values则是很多形式,比如数值、字符串、boolean、对象、json数组、json对象等。

String toJson(Object src) : 将对象转换为对应格式的json字符串
T fromJson(String json, Type typeOfT) : 解析Json字符串, 得到对象

  • 3、利用Gson解析数据信息
    3.1、将json格式的字符串{}转换为Java对象
//实体bean类
    public class ShopInfo {

    private int id;
    private String name;
    private double price;
    private String imagePath;

    public ShopInfo(int id, String name, double price, String imagePath) {
        super();
        this.id = id;
        this.name = name;
        this.price = price;
        this.imagePath = imagePath;
    }

    public ShopInfo() {
        super();
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getImagePath() {
        return imagePath;
    }

    public void setImagePath(String imagePath) {
        this.imagePath = imagePath;
    }

> 注:Java中的toString方法在Object中已经存在。由于Java中所有的类都继承自Object类,所以此方法存在于所有对象中,其作用是为了方便所有类的字符串操作。在Java的API文档中指出“建议所有子类都重写此方法”。如果继承object的toString()方法则会打印出以哈希值的无符号十六进制形式。

    @Override
    public String toString() {
        return "ShopInfo [id=" + id + ", name=" + name + ", price=" + price
                + ", imagePath=" + imagePath + "]";
    }

}

public void testJsonToObject()  {
        String jsonString = "{\"id\":1, \"name\":\"金文\", \"price\":10000000,\"imagePath\":\"http://192.168.10.165:8080/servier/images/jinzi.jpg\"}";

        ShopInfo shopInfo = new Gson().fromJson(jsonString, ShopInfo.class);

        Log.e("TAG", shopInfo.toString());
    }

3.2、将json格式的字符串[]转换为Java对象的List

//由于Java泛型的实现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是Object类型)。由于在运行期间无法得知T的具体类型,对这个类的对象进行序列化和反序列化都不能正常进行。Gson通过借助TypeToken类来解决这个问题。只要将需要获取类型的泛型类作为TypeToken的泛型参数构造一个匿名的子类,就可以通过getType()方法获取到我们使用的泛型类的泛型参数类型。**简单来说就是使用了泛型的类的构造函数中显示地传入泛型类的Class类型作为这个泛型类的私有属性,它保存了泛型类的类型信息。**
public void testJsonToList2() throws JSONException {
        String jsonString = "[{\"id\":2, \"name\":\"猪八戒\", \"price\":12.3,\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f1.jpg\"},"
                + "{\"id\":3, \"name\":\"孙悟空\", \"price\":128.3,\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f2.jpg\"}]";

        List<ShopInfo> list = new Gson().fromJson(jsonString, new TypeToken<List<ShopInfo>>(){}.getType());

        Log.e("TAG", list.toString());
    }

3.3、 将Java对象转换为json字符串{}

public void testObjectToJson() {
        ShopInfo info = new ShopInfo(300, "金子", 100000, "http://www.biying.com");
        String json = new Gson().toJson(info);
        Log.e("TAG", json);
    }

3.4、将Java对象的List转换为json字符串[]

public void testListToJson() {

        List<ShopInfo> list = new ArrayList<ShopInfo>();
        list.add(new ShopInfo(3, "请求", 1000, "http://www.sina.com"));
        list.add(new ShopInfo(4, "请问", 2000, "http://www.sina.com222"));

        String json = new Gson().toJson(list);

        Log.e("TAG", json);
    }

3.5、当服务器端给出的json对象中key的情况非常特殊的情况,比如我们的name字段变成了 is name、age的字段变成1等等的形式,那么我们也不能Javabean就没有办法写了,所以就可以使用map去封装json对象。

public void testJsonToMap() {
        String jsonString = "{\"is name\":\"放大\", \"1\":12}";
        Map<String, Object> map = new Gson().fromJson(jsonString, new TypeToken<Map<String, Object>>(){}.getType());
        Log.e("TAG", map.toString());
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值