Gson不解析属性及其重命名

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容