本文參考了虛函數(shù)的訪問控制與多態(tài),在此基礎(chǔ)上,通過示例說明了虛函數(shù)的重載不受訪問控制符的限制涡戳,通過指針或者引用可以訪問到各個(gè)訪問控制級(jí)別的虛函數(shù)钳枕。 編譯器在決定調(diào)用函數(shù)時(shí)挤庇,如...
本文參考了虛函數(shù)的訪問控制與多態(tài),在此基礎(chǔ)上,通過示例說明了虛函數(shù)的重載不受訪問控制符的限制涡戳,通過指針或者引用可以訪問到各個(gè)訪問控制級(jí)別的虛函數(shù)钳枕。 編譯器在決定調(diào)用函數(shù)時(shí)挤庇,如...
網(wǎng)上關(guān)于Retrofit(這里指的是Retrofit2包里的Retrofit)的文章已經(jīng)普天蓋地了拐格!為什么還要寫這一篇呢吵取?“扔物線”給了我啟發(fā)逐虚!人們還是喜歡原創(chuàng)的東西聋溜,而不是...
package com.ueuo.gson;
public class Result<T> {
public int code;
public String message;
public T data;
}
package com.ueuo.gson;
import com.google.gson.annotations.SerializedName;
public class User {
public String name;
public int age;
@SerializedName(value = "emailAddress", alternate = {"email", "email_address"})
public String emailAddress;
public User(){
}
public User(String name, int age){
this.name = name;
this.age = age;
}
public User(String name, int age, String emailAddress){
this.name = name;
this.age = age;
this.emailAddress = emailAddress;
}
}
搞定Gson泛型封裝作者: @怪盜kidou 如需轉(zhuǎn)載需在明顯位置保留作者信息及原文鏈接如果博客中有不恰當(dāng)之處歡迎留言交流http://www.reibang.com/p/d62c2be60...
CustomTypeAdapter<T>示例:
第二部分
@SuppressWarnings("unchecked")
@Override
public T read(JsonReader in) throws IOException {
if( in.peek().equals(JsonToken.BEGIN_ARRAY)){
List<User> list = new ArrayList<User>();
in.beginArray();
while (in.hasNext()) {
User user = new User();
in.beginObject();
while (in.hasNext()) {
switch (in.nextName()) {
case "name":
user.name = in.nextString();
break;
case "age":
user.age = in.nextInt();
break;
case "email":
case "email_address":
case "emailAddress":
user.emailAddress = in.nextString();
break;
}
}
in.endObject();
list.add(user);
}
in.endArray();
return (T) list;
}else{
User user = new User();
in.beginObject();
while (in.hasNext()) {
switch (in.nextName()) {
case "name":
user.name = in.nextString();
break;
case "age":
user.age = in.nextInt();
break;
case "email":
case "email_address":
case "emailAddress":
user.emailAddress = in.nextString();
break;
}
}
in.endObject();
return (T) user;
}
}
}
你真的會(huì)用Gson嗎?Gson使用指南(四)本文為作者根據(jù)日常使用結(jié)合Gson源碼注釋及wiki所作的原創(chuàng)內(nèi)容,轉(zhuǎn)載請(qǐng)注明出處叭爱。 該系列其它文章 你真的會(huì)用Gson嗎?Gson使用指南(一) 你真的會(huì)用Gson嗎?Gs...
CustomTypeAdapter<T>示例:
第一部分
package com.ueuo.gson;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
public class CustomTypeAdapter<T> extends TypeAdapter<T>{
@SuppressWarnings("unchecked")
@Override
public void write(JsonWriter out, T paramT) throws IOException {
if(paramT instanceof User){
out.beginObject();
User user = (User)paramT;
out.name("name").value(user.name);
out.name("age").value(user.age);
out.name("email").value(user.emailAddress);
out.endObject();
}else if(paramT instanceof List<?>){
List<User> users = (List<User>)paramT;
out.beginArray();
for (User value : users) {
out.beginObject();
out.name("name").value(value.name);
out.name("age").value(value.age);
out.name("email").value(value.emailAddress);
out.endObject();
}
out.endArray();
}
}
你真的會(huì)用Gson嗎?Gson使用指南(四)本文為作者根據(jù)日常使用結(jié)合Gson源碼注釋及wiki所作的原創(chuàng)內(nèi)容撮躁,轉(zhuǎn)載請(qǐng)注明出處。 該系列其它文章 你真的會(huì)用Gson嗎?Gson使用指南(一) 你真的會(huì)用Gson嗎?Gs...
示例( 因?yàn)樘L(zhǎng)分幾部分):
第七部分:
System.out.println("\n方案二:");
Gson gson10 = new GsonBuilder().registerTypeHierarchyAdapter(List.class, new JsonDeserializer<List<?>>() {
@Override
public List<?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
if (json.isJsonArray()) {
JsonArray array = json.getAsJsonArray();
Type itemType = ((ParameterizedType) typeOfT).getActualTypeArguments()[0];
List list = new ArrayList<>();
for (int i = 0; i < array.size(); i++) {
JsonElement element = array.get(i);
Object item = context.deserialize(element, itemType);
list.add(item);
}
return list;
} else {
//和接口類型不符涤伐,返回空List
return Collections.EMPTY_LIST;
}
}
}).create();
List<User> users10 = gson10.fromJson(result2, type);
for(User user10 : users10){
System.out.println(user10.name+"; "+user10.age+"; "+user10.emailAddress);
}
List<User> users11 = gson10.fromJson("\"\"", type);
System.out.println(users11);
}
}
你真的會(huì)用Gson嗎?Gson使用指南(四)本文為作者根據(jù)日常使用結(jié)合Gson源碼注釋及wiki所作的原創(chuàng)內(nèi)容馒胆,轉(zhuǎn)載請(qǐng)注明出處。 該系列其它文章 你真的會(huì)用Gson嗎?Gson使用指南(一) 你真的會(huì)用Gson嗎?Gs...
示例( 因?yàn)樘L(zhǎng)分幾部分):
第六部分:
System.out.println("\n四凝果、@JsonAdapter注解");
System.out.println("\n使用@JsonAdapter注解");
Gson gson7 = new Gson();
User7 user7 = new User7("怪盜kidou", 24, "ikidou@example.com");
System.out.println(gson7.toJson(user7));
System.out.println("\n六祝迂、TypeAdapter實(shí)例");
Gson gson8 = new GsonBuilder().registerTypeHierarchyAdapter(List.class, new JsonDeserializer<List<?>>() {
@Override
public List<?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
if (json.isJsonArray()){
//這里要自己負(fù)責(zé)解析了
Gson newGson = new Gson();
return newGson.fromJson(json,typeOfT);
}else {
//和接口類型不符,返回空List
return Collections.EMPTY_LIST;
}
}
}).create();
System.out.println("\n方案一:");
List<User> users8 = gson8.fromJson(result2, type);
for(User user8 : users8){
System.out.println(user8.name+"; "+user8.age+"; "+user8.emailAddress);
}
List<User> users9 = gson8.fromJson("\"\"", type);
System.out.println(users9);
你真的會(huì)用Gson嗎?Gson使用指南(四)本文為作者根據(jù)日常使用結(jié)合Gson源碼注釋及wiki所作的原創(chuàng)內(nèi)容器净,轉(zhuǎn)載請(qǐng)注明出處型雳。 該系列其它文章 你真的會(huì)用Gson嗎?Gson使用指南(一) 你真的會(huì)用Gson嗎?Gs...
示例( 因?yàn)樘L(zhǎng)分幾部分):
第五部分:
System.out.println("\n三、TypeAdapterFactory");
System.out.println("\n自定義泛型TypeAdapter -- CustomTypeAdapter<T>");
Gson gson6 = new GsonBuilder()
.registerTypeAdapterFactory(new TypeAdapterFactory() {
@Override
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
return new CustomTypeAdapter<T>();
}
})
.create();
List<User> list2 = new ArrayList<User>();
list2.add(new User("a", 11));
list2.add(new User("b", 22));
System.out.println("\n序列化");
String result2 = gson6.toJson(list2, type);
System.out.println(result2);
System.out.println("\n反序列化");
users = gson6.fromJson(result2, type);
for (User u : users) {
System.out.println(u.name+"; "+u.age+"; "+u.emailAddress);
}
System.out.println("\n序列化");
String result3 = gson6.toJson(new User("c", 33), User.class);
System.out.println(result3);
System.out.println("\n反序列化");
User user3 = gson6.fromJson(result3,User.class);
System.out.println(user3.name+"; "+user3.age+"; "+user3.emailAddress);
你真的會(huì)用Gson嗎?Gson使用指南(四)本文為作者根據(jù)日常使用結(jié)合Gson源碼注釋及wiki所作的原創(chuàng)內(nèi)容山害,轉(zhuǎn)載請(qǐng)注明出處纠俭。 該系列其它文章 你真的會(huì)用Gson嗎?Gson使用指南(一) 你真的會(huì)用Gson嗎?Gs...
示例( 因?yàn)樘L(zhǎng)分幾部分):
第四部分:
@Override
public List<User> read(JsonReader in) throws IOException {
List<User> list = new ArrayList<User>();
in.beginArray();
while (in.hasNext()) {
User user = new User();
in.beginObject();
while (in.hasNext()) {
switch (in.nextName()) {
case "name":
user.name = in.nextString();
break;
case "age":
user.age = in.nextInt();
break;
case "email":
case "email_address":
case "emailAddress":
user.emailAddress = in.nextString();
break;
}
}
in.endObject();
list.add(user);
}
in.endArray();
return list;
}
};
Gson gson5 = new GsonBuilder()
.registerTypeAdapter(type, typeAdapter)
.create();
List<User> list = new ArrayList<User>();
list.add(new User("a", 11));
list.add(new User("b", 22));
// 注意,多了個(gè)type參數(shù)
System.out.println("如果一個(gè)被序列化的對(duì)象本身就帶有泛型浪慌,且注冊(cè)了相應(yīng)的TypeAdapter冤荆,\n那么必須調(diào)用Gson.toJson(Object,Type),明確告訴Gson對(duì)象的類型权纤。");
System.out.println("\n序列化");
String result = gson5.toJson(list, type);
System.out.println(result);
System.out.println("\n反序列化");
List<User> users = gson5.fromJson(result, new TypeToken<List<User>>() {}.getType());
for (User u : users) {
System.out.println(u.name+"; "+u.age+"; "+u.emailAddress);
}
你真的會(huì)用Gson嗎?Gson使用指南(四)本文為作者根據(jù)日常使用結(jié)合Gson源碼注釋及wiki所作的原創(chuàng)內(nèi)容钓简,轉(zhuǎn)載請(qǐng)注明出處乌妒。 該系列其它文章 你真的會(huì)用Gson嗎?Gson使用指南(一) 你真的會(huì)用Gson嗎?Gs...
示例( 因?yàn)樘L(zhǎng)分幾部分):
第三部分:
System.out.println("\n所有數(shù)字都轉(zhuǎn)成序列化為字符串的例子");
JsonSerializer<Number> numberJsonSerializer = new JsonSerializer<Number>() {
@Override
public JsonElement serialize(Number src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(String.valueOf(src));
}
};
Gson gson4 = new GsonBuilder().registerTypeAdapter(Integer.class, numberJsonSerializer)
.registerTypeAdapter(Long.class, numberJsonSerializer)
.registerTypeAdapter(Float.class, numberJsonSerializer)
.registerTypeAdapter(Double.class, numberJsonSerializer).create();
System.out.println(gson4.toJson(100.0f));// 結(jié)果:"100.0"
System.out.println(gson4.toJson(100));// 結(jié)果:"100"
System.out.println(gson4.toJson(100.0d));// 結(jié)果:"100.0"
System.out.println(gson4.toJson(0x64));// 結(jié)果:"100"
System.out.println("\nTypeAdapter<List<User>>");
Type type = new TypeToken<List<User>>() {
}.getType();
TypeAdapter<List<User>> typeAdapter = new TypeAdapter<List<User>>() {
@Override
public void write(JsonWriter out, List<User> paramT) throws IOException {
out.beginArray();
for (User value : paramT) {
out.beginObject();
out.name("name").value(value.name);
out.name("age").value(value.age);
out.name("email").value(value.emailAddress);
out.endObject();
}
out.endArray();
}
你真的會(huì)用Gson嗎?Gson使用指南(四)本文為作者根據(jù)日常使用結(jié)合Gson源碼注釋及wiki所作的原創(chuàng)內(nèi)容凿傅,轉(zhuǎn)載請(qǐng)注明出處趾疚。 該系列其它文章 你真的會(huì)用Gson嗎?Gson使用指南(一) 你真的會(huì)用Gson嗎?Gs...
示例( 因?yàn)樘L(zhǎng)分幾部分):
第二部分:
System.out.println();
User user2 = gson.fromJson(stringjson, User.class);
System.out.println(user2.name);
System.out.println(user2.age);
System.out.println(user2.emailAddress);
System.out.println("\n注冊(cè)一個(gè)TypeAdapter序列化和反序列化空字符串");
Gson gson2 = new GsonBuilder().registerTypeAdapter(Integer.class, new TypeAdapter<Integer>() {
@Override
public void write(JsonWriter out, Integer value) throws IOException {
out.value(String.valueOf(value));
}
@Override
public Integer read(JsonReader in) throws IOException {
try {
return Integer.parseInt(in.nextString());
} catch (NumberFormatException e) {
return -1;
}
}
}).create();
System.out.println(gson2.toJson(100)); // 結(jié)果:"100"
System.out.println(gson2.fromJson("\"\"", Integer.class)); // 結(jié)果:-1
System.out.println("\n二铺呵、JsonSerializer與JsonDeserializer");
System.out.println("\n只接管反序列化的過程就用 JsonDeserializer");
Gson gson3 = new GsonBuilder().registerTypeAdapter(Integer.class, new JsonDeserializer<Integer>() {
@Override
public Integer deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
try {
return json.getAsInt();
} catch (NumberFormatException e) {
return -1;
}
}
}).create();
System.out.println(gson3.toJson(100)); // 結(jié)果:100
System.out.println(gson3.fromJson("\"\"", Integer.class)); // 結(jié)果-1
你真的會(huì)用Gson嗎?Gson使用指南(四)本文為作者根據(jù)日常使用結(jié)合Gson源碼注釋及wiki所作的原創(chuàng)內(nèi)容流部,轉(zhuǎn)載請(qǐng)注明出處。 該系列其它文章 你真的會(huì)用Gson嗎?Gson使用指南(一) 你真的會(huì)用Gson嗎?Gs...
示例( 因?yàn)樘L(zhǎng)分幾部分):
第一部分:
package com.ueuo.gson;
import java.io.IOException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
/**
* 四虑凛、你真的會(huì)用Gson嗎?Gson使用指南(四)
*
* http://www.reibang.com/p/3108f1e44155
*
* @Author xbn 2017.11.21
*/
public class UsageGsonFour {
public static void main(String[] args) throws Exception {
System.out.println("\n一梅鹦、TypeAdapter");
System.out.println("\n為User注冊(cè)TypeAdapter");
User user = new User("怪盜kidou", 24);
user.emailAddress = "ikidou@example.com";
Gson gson = new GsonBuilder()
// 為User注冊(cè)TypeAdapter
.registerTypeAdapter(User.class, new UserTypeAdapter()).create();
String stringjson = gson.toJson(user);
System.out.println(stringjson);
你真的會(huì)用Gson嗎?Gson使用指南(四)本文為作者根據(jù)日常使用結(jié)合Gson源碼注釋及wiki所作的原創(chuàng)內(nèi)容谬返,轉(zhuǎn)載請(qǐng)注明出處丧枪。 該系列其它文章 你真的會(huì)用Gson嗎?Gson使用指南(一) 你真的會(huì)用Gson嗎?Gs...
二曹傀、 POJO與JSON的字段映射規(guī)則示例
System.out.println("\nPOJO與JSON的字段映射規(guī)則 -- 默認(rèn)實(shí)現(xiàn)");
Gson gson4 = new GsonBuilder()
// .setFieldNamingPolicy(FieldNamingPolicy.IDENTITY)
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES)
.create();
System.out.println(gson4.toJson(modifierSample));
System.out.println("\nPOJO與JSON的字段映射規(guī)則 -- 自定義實(shí)現(xiàn)");
Gson gson5 = new GsonBuilder()
.setFieldNamingStrategy(new FieldNamingStrategy() {
@Override
public String translateName(Field f) {
// 實(shí)現(xiàn)自己的規(guī)則
if (f.getName().equals("finalField"))
return "final-xbn-Field";
else
return f.getName();
}
}).create();
System.out.println(gson5.toJson(modifierSample));
返回:
POJO與JSON的字段映射規(guī)則 -- 默認(rèn)實(shí)現(xiàn)
{"final-field":"final","public-field":"public","protected-field":"protected","default-field":"default","private-field":"private"}
POJO與JSON的字段映射規(guī)則 -- 自定義實(shí)現(xiàn)
{"final-xbn-Field":"final","publicField":"public","protectedField":"protected","defaultField":"default","privateField":"private"}
你真的會(huì)用Gson嗎?Gson使用指南(三)本文為作者根據(jù)日常使用結(jié)合Gson源碼注釋及wiki所作的原創(chuàng)內(nèi)容,轉(zhuǎn)載請(qǐng)注明出處饲宛。 該系列其它文章 你真的會(huì)用Gson嗎?Gson使用指南(一) 你真的會(huì)用Gson嗎?Gs...