数据交换-JSON
1.认识JSON
前提:why we use JSON? - 好用!
JSON 具有自我描述性,更易理解使用
1.json:JavaScript Object Notatio:JavaScript对象表示法。JSON 是轻量级的文本数据交换格式
2.就是说json其实就是 一种格式,什么样的格式?与JavaScript对象有关---JavaScript自定义对象(k-v键值对)
json用来干什么?用来实现前后端数据的交换,自然的就想到它应该是在http请求与http响应中广泛存在的。
实际怎么使用?类似js自定义对象的写法,k = v,k用来标识value,value可以是字符串,数字Number,数组,json对象,含有json对象的数组。
2.JSON与string的转换
使用方法:JSON.springify(json 对 象) ,将json对象spring化,得到json对象spring化的一个结果,不影响原json对象。
使用方法:JSON.parse(string):string对象转换成json ,不影响原string对象
3.JSON实际使用(Java中)
实际使用:在java中,用 json需要引入到第 3 方的包 gson.jar,gson是Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的java类库,可以对 JSON 字符串 和 Java 对象相互转换。
3.1Javabean 对象和 json 字符串 的转换
回忆javabean是干什么的:(又叫pojo,domin,entity)是在数据库学到的,为了方便映射数据库表,将表的每一行数据作为一个对象使用(oop编程),将每一个数据库表对应了一个Javabean类。
转换:gson 包提供了TypeToken 类,这是一个自定义泛型类,在创建时,需要指定具体类型,继承使用它,我们可以实现把复杂的 json 字符串转换成为 java 对象。
把对象转成为 json 字符串: String str1 = gson.toJson(javabean对象);
把 json 字符串转换成为 java对象 :类名 对象名 = gson.fromJson(str1, 类名.class);
3.2 * List 对象和 json 字符串 的转换
将 List转成 json 字符串:
String bookListStr = gson.toJson(bookList);
将json字符串转成list对象:
gson.fromJson(json字符串,type)
Type type = new TypeToken<List<Book>>() {}.getType();
List<Book> bookList2 = gson.fromJson( bookListStr, type);
这个type是:得到类型的完整路径,然后进行底层反射。
如果需要把json字符串 转成 集合 这样复杂的类型, 需要使用gson提供的一个类,
com.google.gson.reflect public class TypeToken<T> { final Class<? super T> rawType; final Type type; final int hashCode; protected TypeToken() { this.type = getSuperclassTypeParameter(this.getClass()); this.rawType = Types.getRawType(this.type); this.hashCode = this.type.hashCode(); }
阅读源码可知:使用的是TypeToken , 是一个自定义泛型类,通过TypeToken来指定我们需要转换成的类型
因为fromJson方法需要得到类型的完整路径,然后进行底层反射。
再次理解匿名内部类的作用与本质:就相当于外部类的一个(一次性)对象,有点像一个局部变量,它可以直接访问外部类的所用成员,甚至是private的,比如这里转换中第 3 方的包 gson.jar里的protected方法protected TypeToken() {...},使用匿名内部类隐式的构造器在调隐式的super,通过这种方式调到TypeToken的构造器,创建一个TypeToken对象,在调.getType()方法为fromJson方法得到类型的完整路径,然后进行底层反射。
3. 3 map 对象和 json 字符串 的转换
将map 对象转成 json 字符串:
String bookMapStr = gson.toJson(bookMap)
将json 字符串:转成map 对象:
Map<String,Book> mapbook= gson.fromJson(bookMapStr, new Typetoken<Map<String,book>>(){}.getType());