美文网首页Android程序员
Gson不解析属性及其重命名

Gson不解析属性及其重命名

作者: 一家之主小书童 | 来源:发表于2018-03-31 17:29 被阅读977次

    json在日常开发中有2种情况是经常要处理的。一种是json字段与类属性不一致。比如蛇形转驼峰,另一种情况部分属性不序列化

    SerializedName注解

    SerializedName 用于json属性与对象属性名映射关系;
    SerializedName 有2个属性。value,alternate 。
    value:序列化或反序列化时字段的期望名称。
    alternate:该字段在反序列化时的其他名称。
    这2个属性什么意识呢?其实就是我们一般起别名就是因为该json是由其他语言规范序列化的来的,但是如果这个对象我们也要序列化返回给其他人使用直接使用默认的SerializedName明显不合适因为序列化的值将是其他语言的规范所以设置value为java的规范,alternate为其他语言的规范。这样反序列使用其他语言。
    ps:注意如果json中同事出现value 和alternate 包含的值,反序列的结果将是json串中后出现的值

    Expose注解

    Expose 用户具体属性的显示;
    Expose有2个属性 serialize, deserialize 这2个属性默认都是true;如果有需求可以自定义;
    不过要该注解生效。Gson对象不能使用new Gson()来创建对象。应该使用new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); 来构建
    Gson excludeGson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();

    示例代码

    
    import com.google.gson.annotations.Expose;
    import com.google.gson.annotations.SerializedName;
    
    public class OrderRequest {
    
        /**
         * 用户标识
         */
        @Expose(serialize = false)
        @SerializedName("user_id")
        private String userId;
        /**
         * 商品标识
         */
        @Expose(deserialize = false)
        @SerializedName("goods_id")
        private String goodsId;
        /**
         * 价格
         */
        private int price;
        @Expose
        @SerializedName("order_no")
        private String orderNo;
    
        public String getOrderNo() {
            return orderNo;
        }
    
        public void setOrderNo(String orderNo) {
            this.orderNo = orderNo;
        }
    
        public String getUserId() {
            return userId;
        }
    
        public void setUserId(String userId) {
            this.userId = userId;
        }
    
        public String getGoodsId() {
            return goodsId;
        }
    
        public void setGoodsId(String goodsId) {
            this.goodsId = goodsId;
        }
    
        public int getPrice() {
            return price;
        }
    
        public void setPrice(int price) {
            this.price = price;
        }
    
        @Override
        public String toString() {
            return String.format("userId:%s ,goodsId:%s,price:%d,orderNo:%s", userId, goodsId, price, orderNo);
        }
    }
    
    

    测试用例

    对象序列化json

    @Test
    public void testSerialization() {
        OrderRequest request = new OrderRequest();
        request.setPrice(10);
        request.setGoodsId("g01");
        request.setUserId("1");
        request.setOrderNo("20180331100001");
        Gson gson = new Gson();
        System.out.println("Gson:" + gson.toJson(request));
        Gson excludeGson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
        System.out.println("ExcludeGson:" + excludeGson.toJson(request));
    }
    

    输出结果

    Gson:{"user_id":"1","goods_id":"g01","price":10,"order_no":"20180331100001"}
    ExcludeGson:{"goods_id":"g01","order_no":"20180331100001"}
    

    对象反序列化

    @Test
    public void testDeserialization() {
        String json = "{\"user_id\":\"1\",\"goods_id\":\"goods\",\"price\":10,\"order_no\":\"20180331100001\"}";
        Gson gson = new Gson();
        System.out.println(gson.fromJson(json, OrderRequest.class));
        Gson excludeGson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
        System.out.println(excludeGson.fromJson(json, OrderRequest.class));
    }
    

    输出结果

    userId:1 ,goodsId:goods,price:10,orderNo:20180331100001
    userId:1 ,goodsId:null,price:0,orderNo:20180331100001
    

    相关文章

      网友评论

        本文标题:Gson不解析属性及其重命名

        本文链接:https://www.haomeiwen.com/subject/mnpqcftx.html