Gson系列2 --- 番外篇 -- Gson如何序列化值为null的属性为空字符串或null

1、简述

> 番外篇 如何序列化值为null的属性
  
  方式1new GsonBuilder().serializeNulls().create();
  
    方式2: 重写相应的 TypeAdapters 解析规则 -- null 转换为空字符串
  
  方式3: 自定义 TypeAdapterFactory 
下面重点介绍方式2 和 方式3

2、方式2 重写TypeAdapters的解析规则

  

 通过new Gson()查看对应的构造器 ,
    Gson的数据解析都是委托到各个TypeAdapter内进行处理的。
    在Gson的构造函数内会预先加载一部分TypeAdapter,
       包含Stringintlongdouble等类型,都存放在factories中,如下:
       
发现都可以通过自定义TypeAdapter解决。

自定义TypeAdapter,将其放入facotries中,
  并且gson在解析json时使用对应的TypeAdapter来的,
  而我们手动添加的TypeAdapter会优先于预设的TypeAdapter被使用
  
因此 我们来覆盖 一些常用的包装类型的 null值的序列化

重写自己的TypeAdapters  

package sun.rain.amazing.gson.type;

import com.google.gson.JsonSyntaxException;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;

import java.io.IOException;

/**
 * 变成不可被继承的
 * @author sunRainAmazing
 */
public final class TypeAdaptersRedefine {

    public static final String EMPTY = "";


    /**
     * 对于String 类型 的 策略
  */
    public static final TypeAdapter<String> STRING = new TypeAdapter<String>() {
        //进行反序列化
        @Override
        public String read(JsonReader reader) {
 
            try {
                if (reader.peek() == JsonToken.NULL) {
                    reader.nextNull();
                    return null;
                }
                //要进行属性值的判断 若为 空字符串 则返回null 否则返回 本身的值
        String result = reader.nextString();
                return result.length() > 0 ? result : null;
            } catch (Exception e) {
                throw new JsonSyntaxException(e);
            }
        }

        // 进行序列化
        @Override
        public void write(JsonWriter writer, String value) {
            try {
                if (value == null) {
 
                    writer.value(EMPTY);
                    return;
                }
                writer.value(value);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };


    /**
     * 对于int Integer 类型
  * 由于 int 类型 有默认值 0  *    -- 通常我们无法确定 0 是否具备实际意义
  * 但是 Integer 的类型 null , 我们可以确定的是 -- 无意义的
  *
    * 因此在设计属性的类型是 通常采用 Integer  而不是 int 类型
  *
   * 故 由于 int 0  具备 实际意义  -- 不进行转换
  * 而是转换 Integer 类型的 null   */
    public static final
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设有以下json字符串: ``` { "name": "张三", "age": 20, "gender": "男", "hobbies": ["篮球", "游泳", "旅游"], "address": { "province": "广东", "city": "深圳", "district": "南山区" } } ``` 可以使用Gson库将其解析为对应的Json对象,并根据key获取value。 首先需要添加Gson库的依赖: ``` dependencies { implementation 'com.google.code.gson:gson:2.8.5' } ``` 然后可以编写以下代码: ```java import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonObject; public class GsonTest { public static void main(String[] args) { String jsonStr = "{\"name\":\"张三\",\"age\":20,\"gender\":\"男\",\"hobbies\":[\"篮球\",\"游泳\",\"旅游\"],\"address\":{\"province\":\"广东\",\"city\":\"深圳\",\"district\":\"南山区\"}}"; Gson gson = new Gson(); JsonElement jsonElement = gson.fromJson(jsonStr, JsonElement.class); if (jsonElement != null && jsonElement.isJsonObject()) { JsonObject jsonObject = jsonElement.getAsJsonObject(); String name = jsonObject.get("name").getAsString(); int age = jsonObject.get("age").getAsInt(); String gender = jsonObject.get("gender").getAsString(); System.out.println("姓名:" + name); System.out.println("年龄:" + age); System.out.println("性别:" + gender); JsonElement hobbiesElement = jsonObject.get("hobbies"); if (hobbiesElement != null && hobbiesElement.isJsonArray()) { System.out.print("爱好:"); for (JsonElement hobby : hobbiesElement.getAsJsonArray()) { System.out.print(hobby.getAsString() + " "); } System.out.println(); } JsonObject addressObject = jsonObject.getAsJsonObject("address"); if (addressObject != null) { String province = addressObject.get("province").getAsString(); String city = addressObject.get("city").getAsString(); String district = addressObject.get("district").getAsString(); System.out.println("省份:" + province); System.out.println("城市:" + city); System.out.println("区县:" + district); } } } } ``` 输出结果为: ``` 姓名:张三 年龄:20 性别:男 爱好:篮球 游泳 旅游 省份:广东 城市:深圳 区县:南山区 ``` 可以看到,通过Gson库解析后可以方便地获取Json对象中的数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值