Android-第三方框架-json解析(FastJson,GJson)

来源:互联网 发布:python接收命令行参数 编辑:程序博客网 时间:2024/06/06 06:33

简介

目前,服务器数据请求大多以json格式返回,android2.3提供的json解析类 JSONObject。但是这个需要自己封装一个json解析类。同时目前主流框架选择:
google的Gson 和阿里巴巴的FastJson。

FastJson

compile 'com.alibaba:fastjson:1.2.22'

下载地址http://repo1.maven.org/maven2/com/alibaba/fastjson/1.2.14/

FastJson常用的序列化操作都可以在JSON类上的静态方法直接完成。
public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray
public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject
public static final T parseObject(String text, Class clazz); // 把JSON文本parse为JavaBean
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
public static final List parseArray(String text, Class clazz); //把JSON文本parse成JavaBean集合
public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本
public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本
public static final Object toJSON(Object javaObject); 将JavaBean转换为JSONObject或者JSONArray。

示例

json数据1 - data: {"status":1,"data":"","messages":"验证成功"}JSONObject jsonObject = JSONObject.parseObject(data);String message = jsonObject.getString("messages");
**json数据2 - data:** {    "now": {        "englishName": "Sunny/Clear",        "imgUrl": "http://10.60.62.118:8090/parkinglot//images/cond_icon/100.png",        "fl": "36",        "name": "晴",        "code": 100    },    "aqi": {        "pm10": "72",        "pm25": "43",        "qlty": "轻度污染"    },    "vehicle_restriction": {}}**新建Bean对象**public class WeatherBean {    private Aqi aqi;    private Now now;    private Vehicle vehicle_restriction;    public Aqi getAqi() {        return aqi;    }    public void setAqi(Aqi aqi) {        this.aqi = aqi;    }    public Now getNow() {        return now;    }    public void setNow(Now now) {        this.now = now;    }    public Vehicle getVehicle_restriction() {        return vehicle_restriction;    }    public void setVehicle_restriction(Vehicle vehicle_restriction) {        this.vehicle_restriction = vehicle_restriction;    }    public class Aqi{        public String pm10;        public String pm25;        public String qlty;    }    public class Now{        public String code;        public String name;        public String englishName;        public String imgUrl;        public String fl;    }    public class Vehicle{        public String number;        public String area;    } }**数据转换**WeatherBean weath = JSONObject.parseObject(resultData,WeatherBean.class);

其他的就不一一说明,需要的自己尝试或度娘。

注:经验得出:fastjson的key不区分大小的。
例如:private Aqi aqi;写成private Aqi AQI;也可以解析出来

错误及解决

  • 错误1:JSONObject parseObject解析错误

    com.alibaba.fastjson.JSONException: syntax error, expect {, actual [, pos 0

    原因:
    1:http请求方式错误。Get请求写成了Post请求。
    2:bean里内嵌了一个bean变量。,转换有时会有问题。
    3:返回是List,调用错误。

    解决:
    JSONObject parseObject 改 JSONObject.parseArray(个人尝试)

Gson

Gson由谷歌研发,可以把Java对象转换成JSON,也可以把JSON字符串转换成一个相等的Java对象。Gson支持任意复杂Java对象包括没有源代码的对象。

compile 'com.google.code.gson:gson:2.4'

下载,http://search.maven.org/#search%7Cga%7C1%7Ccom.google.code.gson

toJson()方法

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

  1. String toJson(JsonElement jsonElement); //JsonObject、JsonArray等转换成JSON数据
  2. String toJson(Object src);//用于将指定的Object对象序列化成相应的JSON数据
  3. String toJson(Object src, Type typeOfSrc);//用于将指定的Object对象(可以包括泛型类型)序列化成相应的JSON数据

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

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

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

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

**json数据**  String s="[{name:'zhangsan',age:12},{name:'lisi',age:12}]";**bean对象**public class user {    private String name;    private int age;    .....}**json转换**new Gson()fromJson(jsonString, new TypeToken<List<Person>>(){}.getType());
阅读全文
0 0
原创粉丝点击