推广产品的文案,seo与sem的区别,wordpress网,合肥网站制作企业JSON 是一种文本形式的数据交换格式#xff0c;它比XML更轻量、比二进制容易阅读和编写#xff0c;调式也更加方便;解析和生成的方式很多#xff0c;Java中最常用的类库有#xff1a;JSON-Java、Gson、Jackson、FastJson等一、Gson的基本用法Gson提供了fromJson() 和toJson…JSON 是一种文本形式的数据交换格式它比XML更轻量、比二进制容易阅读和编写调式也更加方便;解析和生成的方式很多Java中最常用的类库有JSON-Java、Gson、Jackson、FastJson等一、Gson的基本用法Gson提供了fromJson() 和toJson() 两个直接用于解析和生成的方法前者实现反序列化后者实现了序列化同时每个方法都提供了重载方法(1)基本数据类型的解析Gson gson new Gson();int i gson.fromJson(100, int.class); //100double d gson.fromJson(\99.99\, double.class); //99.99boolean b gson.fromJson(true, boolean.class); // trueString str gson.fromJson(String, String.class); // String(2)基本数据类型的生成Gson gson new Gson();String jsonNumber gson.toJson(100); // 100String jsonBoolean gson.toJson(false); // falseString jsonString gson.toJson(String); //String(3)POJO类的生成与解析public class User {//省略其它public String name;public int age;public String emailAddress;}生成JSONGson gson new Gson();User user new User(张三,24);String jsonObject gson.toJson(user); // {name:张三kidou,age:24}解析JSONGson gson new Gson();String jsonString {\name\:\张三\,\age\:24};User user gson.fromJson(jsonString, User.class);二、属性重命名 SerializedName 注解的使用从上面POJO的生成与解析可以看出json的字段和值是的名称和类型是一一对应的但也有一定容错机制(如第一个例子第3行将字符串的99.99转成double型)但有时候也会出现一些不和谐的情况如期望的json格式{name:张三,age:24,emailAddress:zhangsanceshi.com}实际{name:张三,age:24,email_address:zhangsanceshi.com}Gson在序列化和反序列化时需要使用反射一般各类库都将注解放到annotations包下打开源码在com.google.gson包下有一个annotations里面有一个SerializedName的注解类。对于json中email_address这个属性对应POJO的属性则变成SerializedName(email_address)public String emailAddress;为POJO字段提供备选属性名SerializedName注解提供了两个属性上面用到了其中一个别外还有一个属性alternate接收一个String数组注alternate需要2.4版本SerializedName(value emailAddress, alternate {email, email_address})public String emailAddress;//当三个属性(email_address、email、emailAddress)都中出现任意一个时均可以得到正确的结果//当多种情况同时出时以最后一个出现的值为准。Gson gson new Gson();String json {\name\:\张三kidou\,\age\:24,\emailAddress\:\zhangsanceshi.com\,\email\:\zhangsan_2ceshi.com\,\email_address\:\zhangsan_3ceshi.com\};User user gson.fromJson(json, User.class);System.out.println(user.emailAddress); // zhangsan_3example.com三、Gson中使用泛型例如JSON字符串数组[Android,Java,PHP]当要通过Gson解析这个json时一般有两种方式使用数组使用List而List对于增删都是比较方便的所以实际使用是还是List比较多数组比较简单Gson gson new Gson();String jsonArray [\Android\,\Java\,\PHP\];String[] strings gson.fromJson(jsonArray, String[].class);对于List将上面的代码中的 String[].class 直接改为 List.class 是不行的对于Java来说List 和List 这俩个的字节码文件只一个那就是List.class这是Java泛型使用时要注意的问题 泛型擦除为了解决的上面的问题Gson提供了TypeToken来实现对泛型的支持所以将以上的数据解析为List时需要这样写Gson gson new Gson();String jsonArray [\Android\,\Java\,\PHP\];String[] strings gson.fromJson(jsonArray, String[].class);List stringList gson.fromJson(jsonArray, new TypeToken() {}.getType());//TypeToken的构造方法是protected修饰的,所以上面才会写成new TypeToken() {}.getType() 而不是 new TypeToken().getType()泛型解析对接口POJO的设计影响泛型的引入可以减少无关的代码{code:0,message:success,data:{}}{code:0,message:success,data:[]}我们真正需要的data所包含的数据而code只使用一次message则几乎不用如果Gson不支持泛型或不知道Gson支持泛型的同学一定会这么定义POJOpublic class UserResponse {public int code;public String message;public User data;}当其它接口的时候又重新定义一个XXResponse将data的类型改成XX很明显code和message被重复定义了多次通过泛型可以将code和message字段抽取到一个Result的类中这样只需要编写data字段所对应的POJO即可public class Result {public int code;public String message;public T data;}//对于data字段是User时则可以写为 Result ,当是个列表的时候为 Result四、Gson的流式反序列化(1)自动方式Gson提供了fromJson()和toJson() 两个直接用于解析和生成的方法前者实现反序列化后者实现了序列化。同时每个方法都提供了重载方法Gson.toJson(Object);Gson.fromJson(Reader,Class);Gson.fromJson(String,Class);Gson.fromJson(Reader,Type);Gson.fromJson(String,Type);(2)手动方式手动的方式就是使用stream包下的JsonReader类来手动实现反序列化和Android中使用pull解析XML是比较类似的String json {\name\:\张三\,\age\:\24\};User user new User();JsonReader reader new JsonReader(new StringReader(json));reader.beginObject();while (reader.hasNext()) {String s reader.nextName();switch (s) {case name:user.name reader.nextString();break;case age:user.age reader.nextInt(); //自动转换break;case email:user.email reader.nextString();break;}}reader.endObject(); // throws IOExceptionSystem.out.println(user.name); //张三System.out.println(user.age); // 24System.out.println(user.email); //zhangsanceshi.com自动方式最终都是通过JsonReader来实现的如果第一个参数是String类型那么Gson会创建一个StringReader转换成流操作五、Gson的流式序列化(1)自动方式Gson.toJson方法列表//PrintStream(System.out) 、StringBuilder、StringBuffer和*Writer都实现了Appendable接口。Gson gson new Gson();User user new User(张三,24,zhangsanceshi.com);gson.toJson(user,System.out);(2)手动方式JsonWriter writer new JsonWriter(new OutputStreamWriter(System.out));writer.beginObject() // throws IOException.name(name).value(张三).name(age).value(24).name(email).nullValue() //演示null.endObject(); // throws IOExceptionwriter.flush(); // throws IOException//{name:张三,age:24,email:null}//除了beginObject、endObject还有beginArray和endArray两者可以相互嵌套注意配对即可。beginArray后不可以调用name方法同样beginObject后在调用value之前必须要调用name方法。六、 使用GsonBuilder导出null值、格式化输出、日期时间一般情况下Gson类提供的 API已经能满足大部分的使用场景但有时需要更多特殊、强大的功能时这时候就引入一个新的类 GsonBuilder。GsonBuilder从名上也能知道是用于构建Gson实例的一个类要想改变Gson默认的设置必须使用该类配置GsonGsonBuilder用法//各种配置 //生成配置好的GsonGson gson new GsonBuilder().create();(1)Gson在默认情况下是不动导出值null的键的如public class User {public String name;public int age;//省略public String email;}Gson gson new Gson();User user new User(张三,24);System.out.println(gson.toJson(user)); //{name:张三,age:24}//email字段是没有在json中出现的当在调试时需要导出完整的json串时或API接中要求没有值必须用Null时就会比较有用。使用方法Gson gson new GsonBuilder().serializeNulls() .create();User user new User(张三, 24);System.out.println(gson.toJson(user)); //{name:张三,age:24,email:null}格式化输出、日期时间及其它Gson gson new GsonBuilder()//序列化null.serializeNulls()// 设置日期时间格式另有2个重载方法// 在序列化和反序化时均生效.setDateFormat(yyyy-MM-dd)// 禁此序列化内部类.disableInnerClassSerialization()//生成不可执行的Json(多了 )]} 这4个字符).generateNonExecutableJson()//禁止转义html标签.disableHtmlEscaping()//格式化输出.setPrettyPrinting().create();//内部类(Inner Class)和嵌套类(Nested Class)的区别原文 : https://www.cnblogs.com/qinxu/p/9504412.html