`

googel代码系列之GSON

阅读更多
一般使用Gson我们一般会用在序列化toJson()和反序列化fromJson(),一般就那么几个方法,使用比较方便简单。


Gson在基本类型中的使用
 Gson gson=new Gson();
 int i=gson.fromJson("100",int.class);
 double d = gson.fromJson("\"99.99\"", double.class);  //99.99
 boolean b = gson.fromJson("true", boolean.class);     // true
 String str = gson.fromJson("String", String.class);   // String
 System.out.println(i+" " +d+" " +b+ " " +str);

//基本数据类型序列化
 String jsonNumber = gson.toJson(100);       // 100
 String jsonBoolean = gson.toJson(false);    // false
 String jsonString = gson.toJson("String"); //"String"



Gson对POJO类的序列化与反序列化
public class User{
    private String name;
    private int age;
    private String emailAddress;
    @SerializedName(value = "userInfo",alternate = {"user_info","info"})
    private String userInfo;

    public User(String name, int age, String emailAddress) {
        this.name = name;
        this.age = age;
        this.emailAddress = emailAddress;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getEmailAddress() {
        return emailAddress;
    }

    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }

    public String getUserInfo() {
        return userInfo;
    }

    public void setUserInfo(String userInfo) {
        this.userInfo = userInfo;
    }
}

//先序列化
 User user=new User("lijian",22,"山西省");
 System.out.println(gson.toJson(user)); //{"name":"lijian","age":22,"emailAddress":"山西省"}


//为POJO字段提供备选属性名alternate提供多个值,如果是多个值中有一个就存那一个,如果都有值就按照alternate 中的最后一个定义获得值,
  String jsonString = "{\"name\":\"怪盗kidou\",\"age\":24,emailAddress:23453245,user_info:2323,info:lksjdl}";
  User user1=gson.fromJson(jsonString,User.class);
  System.out.println(user1.getUserInfo());


Gson中使用泛型
//数组比较简单
String jsonArray = "[aaaa,bbbb,cccc]";
String[] strings = gson.fromJson(jsonArray, String[].class);

//List中泛型只有对应的List.class所以使用list时候注意List的泛型檫除
//这里Gson为我们引入了TypeToken来对泛型的支持
  Gson gson = new Gson();
  String jsonArray = "[aaa,bbbb,ccc]";
  String[] strings = gson.fromJson(jsonArray, String[].class);
  List<String> stringList = gson.fromJson(jsonArray, new TypeToken<List<String>>(){}.getType());
  System.out.println(stringList); //[aaa, bbbb, ccc]

  注意:这里使用时候看看是否自己可以封装一个统一的工具,如果每次使用时候都会new一个TypeToken,试试工具中自己可以封装一些东西让工具调用更加简单

总结一下上边可能是我们最长用到的
1.将对象序列化
2.将jsonString反序列化为对象
3.将reader反序列化为对象
4.将jsonString反序列化为List<对象> Type
5.将reader反序列化为List<对象> Type

底层分析
//这里就是传递的jsonString,可以看见会构建生成StringReader在执行fromJson(Reader json, Class<T> classOfT),可以看得出其实我们上边的5个可以归结为3个,以后在实际中调用最多的可以单独出来处理封装。
public <T> T fromJson(String json, Type typeOfT) throws JsonSyntaxException {
        if(json == null) {
            return null;
        } else {
            StringReader reader = new StringReader(json);
            Object target = this.fromJson((Reader)reader, (Type)typeOfT);
            return target;
        }
    }

    public <T> T fromJson(Reader json, Class<T> classOfT) throws JsonSyntaxException, JsonIOException {
        JsonReader jsonReader = this.newJsonReader(json);
        Object object = this.fromJson((JsonReader)jsonReader, (Type)classOfT);
        assertFullConsumption(object, jsonReader);
        return Primitives.wrap(classOfT).cast(object);
    }


//需要将传递过来的对象直接指定可以序列化
//需要传递过来时候将aaa_bbb直接以aaaBbb解析出来
//或者是需要将驼峰格式转化为下划线的格式
//转化过程中是否需要全部转化为小写
//转化中是否需要序列化null
//序列化中时间格式是否需要修改
//是否有序列化内部类
//是否需要生成特别的json,就是说不是直接拿到就是json比如加几个]}等特殊字符
//是否要转意html标签
//是否可以指定的字段不输出
等等。。。
//在初始化构造时候就默认构造进Gson中的值
public Gson() {
	this(Excluder.DEFAULT, FieldNamingPolicy.IDENTITY, Collections.emptyMap(), false, false, false, true, false, false, false, LongSerializationPolicy.DEFAULT, Collections.emptyList());
}

//通过GsonBuilder构建修改默认的值
//自己构建自己需要的Gson
 Gson gson = new GsonBuilder().
	serializeNulls()//序列化null
	.generateNonExecutableJson()//生成不能执行的json
	.setDateFormat("yyyy-MM-dd") //设置日期时间格式,
	//.setDateFormat(DateFormat.DATE_FIELD)
	.disableInnerClassSerialization()//禁止序列化内部类
	.disableHtmlEscaping()//禁止转移html
	.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) //驼峰转化为下划线 常用
	.excludeFieldsWithModifiers(Modifier.PRIVATE) //指定某些修饰符,比如private等不输出为json
	.excludeFieldsWithModifiers() //指定字段不输出或者用@Expose 常用
	.create();

@Expose //使用默认都是false
@Expose(deserialize = true,serialize = true) //序列化和反序列化都都生效
@Expose(deserialize = true,serialize = false) //反序列化时生效
@Expose(deserialize = false,serialize = true) //序列化时生效


大于等于Since的值时该字段导出,小于Until的值时该该字段导出
一个字段用两个注解时候记得要满足两者
@Since 和 @Until



使用setFieldNamingPolicy时候要注意不要使用@SerializedName,不知道为什么在使用自定义的级别没有@SerializedName的级别高。
所以在遇到@SerializedName想要转换时候要注意,这有可能是你找问题的源头。又会骂gson的烂什么的。


Gson序列化和反序列化的都是借助于GsonBuilder.registerTypeAdapter和GsonBuilder.registerTypeHierarchyAdapter得以施展

class UserAdapter<T> extends TypeAdapter<T> {
    public void write(JsonWriter jsonWriter, T t) throws IOException {
        //序列化操作
    }
    public T read(JsonReader jsonReader) throws IOException {
        //反序列化操作
        return null;
    }
}
class User {
    public String name;
    public int age;
    public String address;
}

//自己构建自己需要的Gson
Gson gson = new GsonBuilder()
		//这里需要重新写自己构建的适应
		.registerTypeAdapter(User.class,new UserAdapter<User>()) //如果使用了该类将会失去默认的好多东西
		.create();

//转化为String
JsonSerializer<Number> numberJsonSerializer = new JsonSerializer<Number>() {
    @Override
    public JsonElement serialize(Number src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(String.valueOf(src));
    }
};
Gson gson = new GsonBuilder()
        .registerTypeAdapter(Integer.class, numberJsonSerializer).create();
//这样类型进去就会转化为String		


Gson源码查看
public <T> TypeAdapter<T> getAdapter(TypeToken<T> type) {
	TypeAdapter cached = (TypeAdapter)this.typeTokenCache.get(type == null?NULL_KEY_SURROGATE:type);
	if(cached != null) {
		return cached;
	} else {
		Object threadCalls = (Map)this.calls.get();
		boolean requiresThreadLocalCleanup = false;
		if(threadCalls == null) {
			threadCalls = new HashMap();
			this.calls.set(threadCalls);
			requiresThreadLocalCleanup = true;
		}

		Gson.FutureTypeAdapter ongoingCall = (Gson.FutureTypeAdapter)((Map)threadCalls).get(type);
		if(ongoingCall != null) {
			return ongoingCall;
		} else {
			try {
				Gson.FutureTypeAdapter call = new Gson.FutureTypeAdapter();
				((Map)threadCalls).put(type, call);
				Iterator var7 = this.factories.iterator();

				TypeAdapter candidate;
				do {
					if(!var7.hasNext()) {
						throw new IllegalArgumentException("GSON cannot handle " + type);
					}

					TypeAdapterFactory factory = (TypeAdapterFactory)var7.next();
					candidate = factory.create(this, type);//这里工厂构建对应的适配器
				} while(candidate == null);

				call.setDelegate(candidate);
				this.typeTokenCache.put(type, candidate);
				TypeAdapter var10 = candidate;
				return var10;
			} finally {
				((Map)threadCalls).remove(type);
				if(requiresThreadLocalCleanup) {
					this.calls.remove();
				}

			}
		}
	}
}	



接管某种类型的序列化JsonSerializer和反序列化JsonDeserializer
@JsonAdapter(UserTypeAdapter.class) //加在类上@JsonAdapter 仅支持 TypeAdapter或TypeAdapterFactory
public class User {
    public User() {
    }
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public User(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }
    public String name;
    public int age;
}













分享到:
评论

相关推荐

    Gson对Java嵌套对象和JSON字符串之间的转换 ..pdf

    Gson是Google提供的一款强大的库,它能够方便地实现Java对象与JSON字符串之间的转换。本篇将详细介绍如何使用Gson处理Java中的嵌套对象和JSON字符串。 首先,理解JSON的基本结构。JSON是一种基于键值对的数据结构,...

    googleapi.jar

    "googleapi.jar" 是一个Java档案文件,通常包含Google提供的一系列API(应用程序接口)类,使得开发者能够集成Google的服务到他们的应用或网站中。这个jar文件可能包含了Google的搜索功能,允许用户通过编程方式与...

    Json入门的一个实用案例

    import com.google.gson.Gson; class Person { String name; int age; String city; // 构造函数、getter和setter省略 } String jsonString = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}"; Gson...

    android仿网易新闻客户端代码求修改

    1. **Material Design设计规范**:网易新闻客户端采用了Google的Material Design设计语言,这要求我们遵循色彩、布局、动画和图标的一系列指导原则,确保应用的视觉一致性。 2. **RecyclerView与Adapter**:在...

    封装json数据以及解析需要的jar包

    2. Gson库:Google提供的Gson库也可以完成相同功能,使用`Gson`类的`toJson()`方法。 ```java import com.google.gson.Gson; public class GsonExample { public static void main(String[] args) { Gson gson = ...

    json类库,Java解析json必用

    Google的Gson库提供了一种更灵活的方式来映射Java对象到JSON,反之亦然。它可以处理复杂的Java类型,如泛型、枚举、自定义类型转换等。以下是如何使用Gson库的例子: ```java import com.google.gson.Gson; public...

    java编写的聊天室代码

    Java提供了一些内置的序列化机制,也可以使用第三方库如Google的Gson或Jackson。 6. **安全性与错误处理**:为了保障聊天室的安全,开发者需要考虑密码加密、防止SQL注入等问题。同时,良好的错误处理机制可以提高...

    android开发视频教程源代码 第二季

    这个系列教程旨在帮助开发者提升技能,掌握Android应用开发的核心要素,并了解最新的开发趋势。以下是本教程源代码中涉及的一些关键知识点: 1. **Android Studio与Gradle**:Android Studio是Google提供的官方集成...

    JDOM&DOM4J;&JSON;&COMMONSjar;包.zip

    Gson是Google提供的一个库,它允许在Java对象和JSON数据之间进行相互转换。与JSON库相比,Gson提供了更高级别的抽象,可以自动将Java对象序列化为JSON字符串,或者反序列化JSON字符串为Java对象。 总结来说,JDOM...

    google 官方基础文档 中文版

    这份文档旨在帮助开发者通过一系列可重用的代码片段和实践课程,掌握Android应用开发的核心技术。 详细知识点: 1. **Android SDK安装** - 开发Android应用的第一步是安装和配置Android SDK,它包含了开发和测试所...

    Google+android的几本书的合集

    9. **Google服务集成**:Google提供了一系列服务,如Google Maps、Firebase、Google Play Services等,学习如何将这些服务整合进应用中,可以增强应用的功能和用户体验。 10. **Material Design**:Google提出的...

    javaWeb添加json支持需要的jar文件

    - **gson-*.jar**:Google的Gson库是另一个流行的Java到JSON转换工具,它能将Java对象直接转换为JSON字符串,反之亦然。如果你的项目中涉及到复杂的Java对象和JSON之间的转换,Gson会非常有用。 - **Jackson相关的...

    安卓开发需要的第三方jar包

    3. **gson-1.7.1.jar**: Gson 是 Google 推出的一个 Java 类库,它能将 Java 对象转换为 JSON 格式字符串,反之亦然。在 Android 开发中,Gson 常用来序列化和反序列化对象,使得数据可以在网络传输或本地存储时以 ...

    android JSON数据的读写方法

    数组是一系列值的有序集合,用方括号[]包围,值之间用逗号分隔。例如: ```json { "name": "John", "age": 30, "city": "New York" } ``` 二、Android中的JSON解析库 Android平台提供了两种内置的JSON解析库:...

    java系列化为xml对象。

    Gson是Google提供的库,同样提供了简单易用的API进行JSON序列化和反序列化。org.json库则提供了一个简单的API,适合小型项目。 在处理"xmlObject对象化工具"这个压缩包时,很可能包含了一些帮助我们实现上述功能的...

    java json demo

    2. Gson:Google开发的Gson库可以将Java对象直接转换成JSON格式的字符串,或者将JSON字符串反序列化为Java对象。 示例: ```java Gson gson = new Gson(); String jsonString = gson.toJson(user); User user =...

    Android从入门到高手进阶(长青说安卓系列)

    2. **JSON解析**:学习JSON格式,使用Gson或Jackson库进行序列化和反序列化。 3. **异步处理**:通过AsyncTask、Handler或Retrofit进行网络请求的异步操作,避免阻塞主线程。 六、多媒体处理 1. **图像加载**:使用...

    Android应用开发详解

    在Android应用开发领域,开发者需要掌握一系列技术和工具来创建功能丰富的移动应用程序。本文将深入探讨Android应用开发的关键知识点,结合“Android应用开发详解”的主题,包括但不限于基础概念、开发环境搭建、UI...

    Google Android SDK开发范例大全 源码 03

    本资源“Google Android SDK开发范例大全 源码 03”提供了一系列的实例,旨在帮助开发者深入理解Android SDK的使用,并通过实践提升开发技能。 一、Android SDK的核心组成部分 1. 平台工具:如adb(Android Debug ...

    java中json依赖的jar包

    Gson是Google提供的一个库,可以将任何Java对象转换为对应的JSON字符串,反之亦然。Gson的使用简单,只需简单的API调用即可完成转换。例如,`Gson().toJson(object)`可将Java对象转为JSON,`new Gson().fromJson...

Global site tag (gtag.js) - Google Analytics