美文网首页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不解析属性及其重命名

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

  • GSON

    需要掌握的知识点 GSON的基本用法 属性重命名 @SerializedName 注解的使用 GSON使用泛型 利...

  • GSON 解析 JSON

    GSON JSON 介绍 Gson 下载 Gson 解析 和 格式化Gson 格式化Gson 解析 解析asset...

  • 最详细gson使用解析

    一、Gson的基本用法 fromJson()实现反序列化,toJson()实现了序列化 二、属性重命名 @Seri...

  • 2018-01-11

    Gson解析复杂json数据常用的两种解析方式 Gson gson = new Gson(); 1.gson.fr...

  • Android 库 Gson

    【Android 库 Gson】 引用: ★Gson 解析教程★★★ Gson的入门使用Gson全解析(上)-Gs...

  • Android Gson官方推荐的json解析方式

    导航 XML的三种解析方式 json全面解析和使用 Gson官方推荐的json解析方式 Gson Gson解析是g...

  • Android常用依赖

    ### Gson解析依赖 implementation 'com.google.code.gson:gson:2....

  • GSON: Expected a string but was

    Gson解析遇到错误:GSON: Expected a string but was BEGIN_OBJECT? ...

  • Data class的Moshi/Gson实现方式:

    1.GSON解析: import com.google.gson.annotations.SerializedNa...

网友评论

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

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