Gsonは属性とその名前を解析しません
3703 ワード
jsonは日常開発でよく処理される2つのケースがある.1つは、jsonフィールドがクラス属性と一致しないことです.例えばヘビ形のアルパカのように、もう一つの場合、部分的な属性はシーケンス化されません.
SerializedName注記
SerializedNameは、json属性とオブジェクト属性名のマッピング関係に使用します.SerializedNameには2つの属性があります.value,alternate . value:シーケンス化または逆シーケンス化時のフィールドの所望の名前.Alternate:このフィールドの逆シーケンス化時の他の名前.この2つの属性はどんな意識ですか?実は私たちが一般的に別名をつけたのは、jsonが他の言語仕様でシーケンス化されているからですが、このオブジェクトをシーケンス化して他の人に返すには、デフォルトのSerializedNameを直接使用するのは明らかに適切ではありません.シーケンス化の値は他の言語の仕様になるので、valueをjavaの仕様に設定し、alternateを他の言語の仕様に設定します.このように逆シーケンスは他の言語を使用します.
Expose注記
Exposeユーザーの具体的な属性の表示;Exposeには2つのプロパティserializeがあり、deserializeの2つのプロパティのデフォルトはtrueです.必要に応じてカスタマイズできます.ただし、この注釈を有効にする必要があります.Gsonオブジェクトはnew Gson()を使用してオブジェクトを作成できません.new GsonBuilder()を使用するべきです.excludeFieldsWithoutExposeAnnotation().create();
サンプルコード
テストケース
オブジェクトシーケンス化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