Android框架---Google官方Gson解析(下)

原创 2017年10月17日 09:37:21

Gson还有一种更高级的手法进行序列化和反序列化,那就是TypeAdapter ,就是就是对象json之间的互相转换 接替了T 泛型类的序列化和反序列化的逻辑,大家如果有兴趣可以去看一下源码,2.1版本之前后的用法是不一样的,2.1版本之前可以自定义adapter,在2.1版本之后更推荐直接插入泛型就使用。在这里演示泛型的

代码演示:

public class TypeAdapterTest {
	public static class Person {
		private int per_id;
		private String name;
		private String sex;
		private boolean state;

		public Person(int per_id, String name, String sex, boolean state) {
			this.per_id = per_id;
			this.name = name;
			this.sex = sex;
			this.state = state;
		}

		@Override
		public String toString() {
			return "Person-->[per_id=" + per_id + ", name=" + name + ", sex="
					+ sex + ", state=" + state + "]";
		}
	}

	public static void main(String[] args) throws Exception {
		Gson gson = new Gson();
		TypeAdapter<Person> personTypeAdapter = gson.getAdapter(Person.class);
		Person person = new Person(1, "layne", "man", true);
		String json_str = personTypeAdapter.toJson(person);
		System.out.println("序列化结果:" + json_str);

		Person person1 = personTypeAdapter.fromJson(json_str);
		System.out.println("反序列化结果:" + person1);

	}

}

运行结果:





接下来就是容错机制

为什么要容错了?
在javaBean中编号per_id声明的事int类,如果服务端返回的是""空字符串,那么客户端该怎么办?崩溃吗?
这时候就需要容错机制啦,容错的实现方式:
1.创建Gson的方式
2.使用JsonReader  
3.自定义TypeAdapter
4.使用注解JsonAdapter,其实也是自定义Adapter

1和2可以归为一类 由框架实现,基本json大格式规范,键值对不标准,多引号的问题等等,而不报错停止解析,但是功能相对较弱,能解决bug 

方式1:Gson的创建方式

gson = new GsonBuilder()  
                  .setLenient()// json宽松  
                  .create();  

方式2:使用JsonReader

JsonReader jsonReader = gson.newJsonReader(value.charStream());
jsonReader.setLenient(true);


 3和4也可以归为一类,都属于自定义adapter,但是方式3与gson绑定,方式4使用注解和字段绑定

代码示例:(这种方式比较倾向于整体)

public class FaultToleranceTest {

	public static class Person {
		private int per_id;
		private String name;
		private String sex;
		private boolean state;

		public Person() {

		}

		public Person(int per_id, String name, String sex, boolean state) {
			this.per_id = per_id;
			this.name = name;
			this.sex = sex;
			this.state = state;
		}

		@Override
		public String toString() {
			return "Person-->[per_id=" + per_id + ", name=" + name + ", sex="
					+ sex + ", state=" + state + "]";
		}
	}

	public static class PersonTypeAdapter extends TypeAdapter<Person> {

		@Override
		public Person read(JsonReader in) throws IOException {
			Person person = new Person();
			in.beginObject();
			while (in.hasNext()) {
				switch (in.nextName()) {
				case "per_id":
					try {
						String str = in.nextString();
						person.per_id = Integer.valueOf(str);
					} catch (Exception e) {
					}
					break;
				case "name":
					person.name = in.nextString();
					break;
				case "sex":
					person.sex = in.nextString();
					break;
				case "state":
					person.state = in.nextBoolean();
					break;
				}
			}
			in.endObject();
			return person;
		}

		@Override
		public void write(JsonWriter out, Person person) throws IOException {
			out.beginObject();
			out.name("per_id").value(person.per_id);
			out.name("name").value(person.name);
			out.name("sex").value(person.sex);
			out.name("state").value(person.state);
			out.endObject();

		}

	}

	public static void main(String[] args) {
		Gson gson = new Gson();

		String json_str = "{\"per_id\":\"\",\"name\":\"layne\",\"sex\":\"man\",\"state\":true}";
		System.out.println("服务端发送:" + json_str);
		try {
			Person person = gson.fromJson(json_str, Person.class);
			System.out.println("默认Gson解析:" + person);
		} catch (JsonParseException e) {// java.lang.NumberFormatException:
										// empty String
			System.out.println("默认Gson解析异常:" + e);
		}

		Gson gson2 = new GsonBuilder().registerTypeAdapter(Person.class,
				new PersonTypeAdapter()).create();
		try {
			Person person2 = gson2.fromJson(json_str, Person.class);
			System.out.println("自定义PersonTypeAdapter解析:" + person2);
		} catch (JsonParseException e) {// java.lang.NumberFormatException:
										// empty String
			System.out.println("自定义PersonTypeAdapter解析异常:" + e);
		}

		try {
			PersonTypeAdapter personTypeAdapter = new PersonTypeAdapter();
			Person person3 = personTypeAdapter.fromJson(json_str);
			System.out.println("自定义PersonTypeAdapter解析2:" + person3);
		} catch (Exception e) {
			System.out.println("自定义PersonTypeAdapter解析异常2:" + e);
		}
	}

}

运行结果:



上面的方式是倾向于整体的,下面是注解的方式,比较倾向于字段

代码演示:

public class FaultToleranceTest1 {

	public static class Person {
		@JsonAdapter(IntegerTypeAdapter.class)
		private int per_id;
		private String name;
		private String sex;
		private boolean state;

		public Person() {

		}

		public Person(int per_id, String name, String sex, boolean state) {
			this.per_id = per_id;
			this.name = name;
			this.sex = sex;
			this.state = state;
		}

		@Override
		public String toString() {
			return "Person-->[per_id=" + per_id + ", name=" + name + ", sex="
					+ sex + ", state=" + state + "]";
		}
	}

	public static class Person1 {
		private int per_id;
		private String name;
		private String sex;
		private boolean state;

		public Person1() {

		}

		public Person1(int per_id, String name, String sex, boolean state) {
			this.per_id = per_id;
			this.name = name;
			this.sex = sex;
			this.state = state;
		}

		@Override
		public String toString() {
			return "Person1-->[per_id=" + per_id + ", name=" + name + ", sex="
					+ sex + ", state=" + state + "]";
		}
	}

	public static class IntegerTypeAdapter extends TypeAdapter<Integer> {

		@Override
		public void write(JsonWriter out, Integer value) throws IOException {
			out.value(value);
		}

		@Override
		public Integer read(JsonReader in) throws IOException {
			int i = 0;
			try {
				String str = in.nextString();
				i = Integer.valueOf(str);
			} catch (Exception e) {
			}
			return i;
		}
	}

	public static void main(String[] args) {
		Gson gson = new Gson();

		String json_str = "{\"per_id\":\"\",\"name\":\"layne\",\"sex\":\"man\",\"state\":true}";
		System.out.println("服务器发送:" + json_str);
		try {
			Person1 person1 = gson.fromJson(json_str, Person1.class);
			System.out.println("gson解析:" + person1);
		} catch (Exception e) {
			System.out.println("gson解析异常:" + e);
		}

		try {
			Person person = gson.fromJson(json_str, Person.class);
			System.out.println("JsonAdapter注解解析:" + person);
		} catch (JsonParseException e) {// java.lang.NumberFormatException:
										// empty String
			System.out.println("JsonAdapter注解异常:" + e);
		}
	}

}

运行结果:



上面的两种方式保险是很保险的,但是代码量大,需要维护的地方也多,这里介绍另外一种方式:JsonSerializer与JsonDeserializer 之关系单方面的处理,可以全局注册某个类型的处理

代码演示:

public class FaultToleranceTest2 {

	public static class Person {
		private int per_id;
		private String name;
		private String sex;
		private boolean state;

		public Person() {

		}

		public Person(int per_id, String name, String sex, boolean state) {
			this.per_id = per_id;
			this.name = name;
			this.sex = sex;
			this.state = state;
		}

		@Override
		public String toString() {
			return "Person-->[per_id=" + per_id + ", name=" + name + ", sex="
					+ sex + ", state=" + state + "]";
		}
	}

	public static void main(String[] args) {
		JsonDeserializer<Integer> jsonDeserializer = new JsonDeserializer<Integer>() {

			@Override
			public Integer deserialize(JsonElement json, Type arg1,
					JsonDeserializationContext arg2) throws JsonParseException {
				try {
					return json.getAsInt();
				} catch (NumberFormatException e) {
					return 0;
				}
			}

		};

		String json_str = "{\"per_id\":\"\",\"name\":\"layne\",\"sex\":\"man\",\"state\":true}";
		System.out.println("服务器发送:" + json_str);

		Gson gson = new Gson();
		try {
			Person person1 = gson.fromJson(json_str, Person.class);
			System.out.println("默认gson解析:" + person1);
		} catch (Exception e) {
			System.out.println("默认gson解析异常:" + e);
		}
		
		//方式1.创建Gson的方式
		Gson gson1 = new GsonBuilder().registerTypeAdapter(int.class,
				jsonDeserializer).create();
		try {
			Person person = gson1.fromJson(json_str, Person.class);
			System.out.println("JsonDeserializer<Integer>解析:" + person);
		} catch (Exception e) {
			System.out.println("JsonDeserializer<Integer>解析异常:" + e);
		}

	}

}

运行结果:



版权声明:欢迎以任何形式转载,但请注明作者和出处

图解Google官方示例的各种android框架

Goolge官方的Android框架源码见:GitHub工程; 毋庸置疑,官方给出的框架示例应该是最标准也最具有普适性的。本文根据工程中的示例,画出了各个框架的架构图,以方便快速学习和了解。 1。...
  • chwnpp2
  • chwnpp2
  • 2017年04月05日 18:04
  • 790

Android框架---Google官方Gson解析(上)

Android框架---Google官方Gson解析(上)
  • Jsagacity
  • Jsagacity
  • 2017年09月28日 14:41
  • 348

Google官方支持的MVVM架构框架Data Binding使用入门

最新最新推出的MVVM架构是将MVP中的Presenter换成了View Model,也就是Model +View+ViewModel的模式。这种架构方式可以很便捷的进行数据的交互,当数据发生变化时通...
  • wqc_CSDN
  • wqc_CSDN
  • 2016年11月29日 21:36
  • 1365

google gson 包下载地址

http://code.google.com/p/google-gson/
  • zj360202
  • zj360202
  • 2012年12月07日 14:20
  • 1530

Google Gson官方教程

Google gson
  • yang786654260
  • yang786654260
  • 2015年03月06日 16:40
  • 3778

android之Gson解析json的封装

1. public static T getObject(String jsonString,Class cls) { }
  • u013310075
  • u013310075
  • 2014年04月28日 10:30
  • 1371

再论Android最新架构—Google 官方Android开发新架构指南

简评:虽然说 Android 的架构选择一直都很自由,MVP、MVC、MVVM 各有拥趸。但 Google 最近还是推出了一份关于应用架构的实践指南,并给出了相当详尽的步骤和一些指导建议。希望大家都能...
  • wangwangli6
  • wangwangli6
  • 2017年06月09日 12:19
  • 1644

Android Jackson、Gson、FastJson解析框架对比

目前Android在使用的Json解析框架主要有Jackson、Gson、FastJson、org.json; 因为Android Studio自带的org.json解析 XML 文件时会将整个 X...
  • zhanggang740
  • zhanggang740
  • 2016年08月22日 17:00
  • 4298

android中的网络解析xml,json,html框架

android中网络请求回来数据之后,我们要对其解析。请求的返回的结果格式如果不是自定义协议;那么返回的数据通常是xml,json,html形式的数据了。 下面就是针对上面3种格式进行解析。 xml...
  • baidu_26994091
  • baidu_26994091
  • 2016年06月24日 00:45
  • 5950

解决Android使用GSON时报错 java.lang.NoClassDefFoundError: com.google.gson.Gson

在工程中导入了Gson的jar包,能正常通过编译,但执行时报错java.lang.NoClassDefFoundError: com.google.gson.Gson,查找了半天,原来是自己以导入ex...
  • u011147333
  • u011147333
  • 2014年01月27日 10:06
  • 4881
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android框架---Google官方Gson解析(下)
举报原因:
原因补充:

(最多只允许输入30个字)