Android只json数据的处理-Gson

Gson的基础的使用


Gson提供了fromJson() 和toJson() 两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化。同时每个方法都提供了重载方法,我常用的总共有5个

Gson.toJson(Object);
Gson.fromJson(Reader,Class);
Gson.fromJson(String,Class);
Gson.fromJson(Reader,Type);
Gson.fromJson(String,Type);

基本数据类型的转化:

       Gson gson = new Gson();
//        解析
        int i = gson.fromJson("100", int.class);
        Log.d(TAG, "解析int数据: " + i);
        boolean t = gson.fromJson("true", boolean.class);
        Log.d(TAG, "解析boolean数据 " + t);
        double d = gson.fromJson("33.44", double.class);
        Log.d(TAG, "解析double数据 " + d);
        String s = gson.fromJson("String", String.class);
        Log.d(TAG, "解析String类型的数据" + s);
//        生成
        String i1 = gson.toJson(100);
        Log.d(TAG, "生成int数据: " + i1);
        String t1 = gson.toJson(false);
        Log.d(TAG, "生成boolean数据: " + t1);
        String s1 = gson.toJson("9264264");
        Log.d(TAG, "生成string数据: " + s1);
        String d1 = gson.toJson(33.33);
        Log.d(TAG, "生成double数据: " + d1);

在看别人的博客学习的时候说这个double转化的时候有猫腻但是我没发现 ,这样做的demo是能正常的转换的。

java数据对象的序列化和反序列化

 public String myJsonObject = "{\"user_name\":\"小黑黑\",\"user_password\":\"luanguiming\",\"age\":26}";
    String jsonArray = "[\"Android\",\"Java\",\"PHP\"]";
  Gson gson = new Gson();
//        json数据转化为对象
        UserBean userBean1 = gson.fromJson(myJsonObject, UserBean.class);
        Log.d(TAG, "数据对象为" + userBean1.getUsername() + userBean1.getUserpassword() + userBean1.getAge());
//         转化json数组
        String[] StringArray = gson.fromJson(jsonArray, String[].class);
        Log.d(TAG, "转化的数组为" + StringArray[0]);
//        转化jsn数据为集合
        List<String> jsonList = gson.fromJson(jsonArray, new TypeToken<List<String>>() {
        }.getType());
        Log.d(TAG, "转化的集合为" + jsonList.get(2));

以上是将一个json字符串反序列化为 对象 ,数组,集合的代码

 Gson gson = new Gson();
//        javaBean 转化为json数据
        UserBean userBean = new UserBean("xiaohei", "luanguiming123", 24, new Date());
        String jsonObject = gson.toJson(userBean);
        Log.d(TAG, "将javaBean转化为json串 " + jsonObject);
//        数组对象转化为json
        String arrayjson = gson.toJson(arrays);
        Log.d(TAG, "将数组对象转化为json串 " + arrayjson);
//          list对象转化为json
        String listjson = gson.toJson(list);
        Log.d(TAG, "将集合对象转化为json串 " + listjson);

以上的代码是将javaBean对象,字符串数组,list集合序列化为json字符串

属性重命名的注解

  @SerializedName("user_name")
    public String username;
    @SerializedName("user_password")
    public String userpassword;

通过SerializedName注解将字段设置为转化为json字符串对应的字段名称,

@SerializedName(value = "emailAddress", alternate = {"email", "email_address"})
public String emailAddress;

通过alternate 实现当上面的三个属性(email_address、email、emailAddress)都中出现任意一个时均可以得到正确的结果。
注:当多种情况同时出时,以最后一个出现的值为准。

字段的映射

  • 默认的映射的设置
        Gson gson2 = new GsonBuilder()                .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES)
                .create();
        String sss = gson2.toJson(userBean);
        Log.d(TAG, "借助gsonbuilder实现字段的格式的变化 " + sss);

通过setFieldNamingPolicy()方法实现 内部存放的是以定义好的实体的类型
实体的具体的对应的映射方式

FieldNamingPolicy   结果(仅输出emailAddress字段)
IDENTITY    {"emailAddress":"ikidou@example.com"}
LOWER_CASE_WITH_DASHES  {"email-address":"ikidou@example.com"}
LOWER_CASE_WITH_UNDERSCORES {"email_address":"ikidou@example.com"}
UPPER_CAMEL_CASE    {"EmailAddress":"ikidou@example.com"}
UPPER_CAMEL_CASE_WITH_SPACES    {"Email Address":"ikidou@example.com"
  • 自定义映射的设置
  Gson gson2 = new GsonBuilder()
//                此处可以创建
                .setFieldNamingStrategy(new FieldNamingStrategy() {
                    @Override
                    public String translateName(Field field) {
//                       内部实现字符串的自定义的格式
                        return null;
                    }
                })
                .create();
        String sss = gson2.toJson(userBean);
        Log.d(TAG, "借助gsonbuilder实现字段的格式的变化 " + sss);
        通过使用setFieldNamingStrategy()通过内部的方法自己定义映射的规则。

Gson实现流式序列化和反序列化

  • 自动序列化
Gson提供了fromJson()toJson() 两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化。同时每个方法都提供了重载方法,我常用的总共有5个。
  • 手动反序列化
//        通过jsonReader解析将json数据转化为一个对象
        JsonReader reader = new JsonReader(new StringReader(myJsonObject));
        UserBean bean = new UserBean();
        try {
            reader.beginObject();
            while (reader.hasNext()) {
                String s = reader.nextName();
                switch (s) {
                    case "user_name":
                        bean.username = reader.nextString();
                        break;
                    case "user_password":
                        bean.userpassword = reader.nextString();
                        break;
                    case "age":
                        bean.age = reader.nextInt();
                        break;
                }

            }
            reader.endObject();
            Log.d(TAG, "解析的数据为" + bean.getAge() + bean.getUserpassword() + bean.getUsername());

        } catch (Exception e) {
            e.printStackTrace();
        }

流式反序列化就是通过一个流读取json字符串之后通过jsonReader将他反序列化为一个数据对象。

  • 手动序列化
//   通过jsonWriter将对象转化为json
        UserBean bean1 = new UserBean("小黑", "小黑是程序员", 12, new Date());
        JsonWriter jsonWriter = new JsonWriter(new OutputStreamWriter(System.out));
        try {
            jsonWriter.beginObject()
                    .name("username")
                    .name("password")
                    .name("age");
            jsonWriter.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }

流式序列化就是通过jsonWriter将对象序列化到一个流中通过流中读取数据。

通过GsonBuilder 输出null ,和格式化输出时间

  • 创建GsonBuilder对象
 Gson gson2 = new GsonBuilder()
  .create();
  • 调用对应的方法实现对应的功能`
  Gson gson = new GsonBuilder()
                .serializeNulls()//输出对象中的空的数值
                .create();

备注 默认的情况下序列化的对象没有赋值的字段是不输出的通过
.serializeNulls()空的值也会输出。

 Gson gson = new GsonBuilder()
                // 在序列化和反序化时均生效
                .setDateFormat("yyyy-MM-dd")
                .create();

备注:将时间字段按一定的格式输出

 Gson gson = new GsonBuilder()

//                //格式化输出
                .setPrettyPrinting()
                .create();

备注:格式化输出json字符串

几种过滤指定的字段的讲解

  • 通过@Expose注释指定过滤掉的字段
    @Expose
    public int id;
    @Expose
    public String name;

这样在对javaBean序列化的时候id,name这两个字段会被忽略掉。

  • 基于版本的过滤字段
//    设置version version的值小于4的时候输出的数值
    @Since(4)
    public String name;
//    设置version version的值大于5的时候输出的数值
    @Until(5)
    public String age;
       Gson gson1 = new GsonBuilder()
                .setVersion(3)
                .create();
        String student = gson1.toJson(studentBean);
        Log.d(TAG, "数据转化" + student);

Gson在对基于版本的字段导出提供了两个注解 @Since 和 @Until,和GsonBuilder.setVersion(Double)配合使用。@Since 和 @Until都接收一个Double值。
使用方法:当前版本(GsonBuilder中设置的版本) 大于等于Since的值时该字段导出,小于Until的值时该该字段导出。

  • 基于访问修饰符的字段过滤
  StudentBean studentBean1 = new StudentBean();
        studentBean.setAge("15");
        studentBean.setGender(1);
        studentBean.setName("宅雨声");
        test modifierSample = new test();
        Gson gson2 = new GsonBuilder()
//                 排除指定的权限的字段
                .excludeFieldsWithModifiers(Modifier.FINAL, Modifier.STATIC, Modifier.PRIVATE)
                .create();
        String studentBean2 = gson2.toJson(modifierSample);
        Log.d(TAG, "通过访问的权限设置序列化的数据" + studentBean2);

通过excludeFieldsWithModifiers()方法设置过滤的的访问的权限的名称。

  • 自定义过滤规则
  XhBean bean1 = new XhBean();
        bean1.setAge(12);
        bean1.setDescription("android程序员");
        bean1.setGender("男");
        bean1.setName("栾桂明");
        Gson gson3 = new GsonBuilder()
                .addSerializationExclusionStrategy(new ExclusionStrategy() {
                    @Override
                    public boolean shouldSkipField(FieldAttributes fieldAttributes) {
                        // 这里作判断,决定要不要排除该字段,return true为排除 这里是排除指定名称的字段
                        if ("name".equals(fieldAttributes.getName()))
                            return true;
                        Expose expose = fieldAttributes.getAnnotation(Expose.class);
                        if ((expose != null && expose.deserialize() == false))
                            return true;
                        return false;
                    }

                    @Override
                    public boolean shouldSkipClass(Class<?> aClass) {
                        // 直接排除某个类 ,return true为排除  这里实现的是排除指定的类型的数据
                        return (aClass == int.class || aClass == Integer.class);
                    }
                }).create();
        String xhjson = gson3.toJson(bean1);
        Log.d(TAG, "自定义的输出设置" + xhjson);

通过addSerializationExclusionStrategy()来实现 shouldSkipClass方法设置被过滤调的数据的数据类型
shouldSkipField设置具体的过滤的细节如以上实现的是通过字段的名称过滤。

使用TypeAdapter实现序列化和反序列化有点序列和反序列化的具体的细节可以控制

 XhBean bean1 = new XhBean();
        bean1.setAge(12);
        bean1.setDescription("android程序员");
        bean1.setGender("男");
        bean1.setName("栾桂明");
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(XhBean.class,new UserTypeAdapter())
                .create();
        System.out.println(gson.toJson(bean1));
        UserBean bean =  gson.fromJson(myJsonObject, UserBean.class);
        System.out.println(bean.age+bean.userpassword+bean.username);
public class UserTypeAdapter extends TypeAdapter<XhBean> {
    //    write  -> outputstream -> 将数据写入到输出流中输出
    @Override
    public void write(JsonWriter jsonWriter, XhBean xhBean) throws IOException {
//        把数据写入到流中输出
        jsonWriter.beginObject();
        jsonWriter.name("name").value(xhBean.name);
        jsonWriter.name("gender").value(xhBean.gender);
        jsonWriter.name("age").value(xhBean.age);
        jsonWriter.name("description").value(xhBean.description);
        jsonWriter.endObject();
    }

    //  read -> inoutstream -> 从输入流中读取数据
    @Override
    public XhBean read(JsonReader jsonReader) throws IOException {
        //       从流中读取数据
        XhBean user = new XhBean();
        jsonReader.beginObject();
        while (jsonReader.hasNext()) {
            switch (jsonReader.nextName()) {
                case "name":
                    user.name = jsonReader.nextString();
                    break;
                case "age":
                    user.age = jsonReader.nextInt();
                    break;
                case "gender":
                    user.gender = jsonReader.nextString();
                    break;
                case "description":
                    user.description = jsonReader.nextString();
                    break;

            }
        }
        jsonReader.endObject();
        return user;
    }
}

创建一个类继承TypeAdapter实现具体的序列化和反序列化
通过创建GsonBuilder的registerTypeAdapter()使用自定义的Adapter。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值