Gsonは属性とその名前を解析しません

3703 ワード

jsonは日常開発でよく処理される2つのケースがある.1つは、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