java解析json(四):gson
来源:互联网 发布:广电网络面临的形势 编辑:程序博客网 时间:2024/06/08 17:48
定义
GSON是谷歌提供的开源库,用来解析Json格式的数据
JAR包
gson-2.2.4.jar
主要API
Gson gson = new Gson();gson.fromJsongson.toJson
Gson的基本用法
基本数据类型与json相互转换
@Testpublic void JsonAndCommonType(){ Gson gson = new Gson(); int i = gson.fromJson("100", int.class); //100 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:"+i+" d:"+d+" b:"+b+" str:"+str); //i:100 d:99.99 b:true str:String String intJson = gson.toJson(100); String doubleJson = gson.toJson(99.99); String booleanJson = gson.toJson(false); String stringJson = gson.toJson("String"); System.out.println("intJson:" + intJson + " doubleJson:" + doubleJson +" booleanJson:"+booleanJson+" stringJson:"+stringJson); //intJson:100 doubleJson:99.99 booleanJson:false stringJson:"String"}
简单Bean与json相互转换
Admin.java
class Admin{ private int id; private String name; private String emailAddress; public Admin(){} public Admin(int id, String name, String emailAddress) { super(); this.id = id; this.name = name; this.emailAddress = emailAddress; } //省略getter/setter}
测试:
@Testpublic void SimpleBeanAndJson(){ Admin admin = new Admin(); Gson gson = new Gson(); String jsonStr = gson.toJson(admin); System.out.println(jsonStr); Admin admin2 = gson.fromJson(jsonStr, Admin.class); System.out.println(admin2.getId()+" "+admin2.getName()+" "+admin2.getEmailAddress());}
运行结果:
{"id":1,"name":"nowuseeme","emailAddress":"nowuseeme@xx.com"}1 nowuseeme nowuseeme@xx.com
上述运行结果,若是想让序列化结果名称改变下,如emailAddress改为email或者email_address可在对应的Bean添加注解@SerializedName
进行属性重命名,即
@SerializedName(value="email_address")private String emailAddress;
@SerializedName
还有个alternate
属性(jar包2.4版本及以上才有),反序列化转为bean时三个属性(email_address、email、emailAddress)都中出现任意一个时均可以得到正确的结果。
String jsonStr2 = "{\"id\":1,\"name\":\"nowuseeme\",\"email\":\"nowuseeme@xx.com\"}";Admin admin2 = gson.fromJson(jsonStr2, Admin.class);System.out.println(admin2.getId()+" "+admin2.getName()+" "+admin2.getEmailAddress()); //输出结果: 1 nowuseeme nowuseeme@xx.com
Gson的流式反序列化
自动方式
比较常用的流式反序列化自动方式的重载方法
Gson.fromJson(Reader,Class);Gson.fromJson(String,Class);Gson.fromJson(Reader,Type);Gson.fromJson(String,Type);
手动方式
手动的方式就是使用stream包下的JsonReader类来手动实现反序列化
@Testpublic void readAsReader(){ String json = "{\"id\":\"1\",\"name\":\"nowu\",\"emailAddress\":\"nowuseeme@xx.com\"}"; Admin admin = new Admin(); JsonReader reader = new JsonReader(new StringReader(json)); try { reader.beginObject(); // throws IOException while (reader.hasNext()) { String s = reader.nextName(); switch (s) { case "id": admin.setId(reader.nextInt()); break; case "name": admin.setName(reader.nextString()); //自动转换 break; case "emailAddress": admin.setEmailAddress( reader.nextString()); break; } } reader.endObject(); // throws IOException System.out.println("id:"+admin.getId()+" name:"+admin.getName()+" emailAddress:"+admin.getEmailAddress()); } catch (IOException e) { e.printStackTrace(); } }
Gson的流式序列化
自动方式
由于PrintStream
和Writer
都实现了Appendable
接口,即可
PrintStream printStream = System.out;gson.toJson(Bean, printStream);
稍微改下简单对象和json的转换案例:
@Testpublic void SimpleBeanAndJson(){ Admin admin = new Admin(1,"nowuseeme","nowuseeme@xx.com"); Gson gson = new Gson(); gson.toJson(admin,System.out);}//控制台打印结果:{"id":1,"name":"nowuseeme","emailAddress":"nowuseeme@xx.com"}
手动方式
测试:
@Testpublic void testJsonWriter(){ try { JsonWriter writer = new JsonWriter(new OutputStreamWriter(System.out)); writer.beginObject() // throws IOException .name("id").value("1") .name("name").value("name") .name("email").nullValue() //演示null .endObject(); writer.flush(); // throws IOException } catch (IOException e) { e.printStackTrace(); }}
运行结果:
{"id":"1","name":"name","email":null}
GsonBuilder
作用
GsonBuilder是用于构建Gson实例的一个类,要想改变Gson默认的设置必须使用该类配置Gson。
Gson gson = new GsonBuilder() //各种配置 .create(); //生成配置好的Gson
使用
使用GsonBuilder导出null值(Gson在默认情况下是不动导出值null的键的)、格式化输出、日期时间等
Gson gson = new GsonBuilder() //序列化null .serializeNulls() // 设置日期时间格式,另有2个重载方法 // 在序列化和反序化时均生效 .setDateFormat("yyyy-MM-dd") // 禁此序列化内部类 .disableInnerClassSerialization() //生成不可执行的Json(多了 )]}' 这4个字符) .generateNonExecutableJson() //禁止转义html标签 .disableHtmlEscaping() //格式化输出 .setPrettyPrinting() .create();
TypeAdapter
TypeAdapter
是Gson自2.0(源码注释上说的是2.1)开始版本提供的一个抽象类,用于接管某种类型的序列化和反序列化过程,包含两个注要方法 write(JsonWriter,T)
和 read(JsonReader)
其它的方法都是final
方法并最终调用这两个抽象方法。
注:TypeAdapter
以及 JsonSerializer
和 JsonDeserializer
都需要与 GsonBuilder.registerTypeAdapter
或GsonBuilder.registerTypeHierarchyAdapter
配合使用
AdminTypeAdapter.java
import java.io.IOException;import com.google.gson.TypeAdapter;import com.google.gson.stream.JsonReader;import com.google.gson.stream.JsonWriter;public class AdminTypeAdapter extends TypeAdapter<Admin>{ @Override public Admin read(JsonReader jsonreader) throws IOException { Admin admin = new Admin(); jsonreader.beginObject(); while (jsonreader.hasNext()) { switch (jsonreader.nextName()) { case "id": admin.setId(jsonreader.nextInt()); break; case "name": admin.setName(jsonreader.nextString()); break; case "emailAddress": case "email_address": case "email": admin.setEmailAddress(jsonreader.nextString()); break; } } jsonreader.endObject(); return admin; } @Override public void write(JsonWriter jsonWriter, Admin admin) throws IOException { jsonWriter.beginObject(); jsonWriter.name("id").value(admin.getId()); jsonWriter.name("name").value("管理员"+admin.getName()); jsonWriter.name("emailAddress").value(admin.getEmailAddress()); jsonWriter.endObject(); }}
测试:
@Testpublic void testTypeAdapter(){ Admin admin = new Admin(1,"nowuseeme","nowuseeme@xx.com"); Gson gson = new GsonBuilder().registerTypeAdapter(Admin.class, new AdminTypeAdapter()).create(); gson.toJson(admin, System.out);}
输出结果:
{"id":1,"name":"管理员nowuseeme","emailAddress":"nowuseeme@xx.com"}
JsonSerializer与JsonDeserializer
JsonSerializer
@Testpublic void testSerializer(){ Gson gson = new GsonBuilder().registerTypeAdapter(Admin.class, new JsonSerializer<Admin>(){ @Override public JsonElement serialize(Admin admin, Type type,JsonSerializationContext arg2) { final JsonObject jsonObject = new JsonObject(); //集合数组用JsonArray jsonObject.addProperty("id", admin.getId()); jsonObject.addProperty("name", admin.getName()); jsonObject.addProperty("admin_email", admin.getEmailAddress()); return jsonObject; } }).create(); Admin admin = new Admin(1,"nowuseeme","nowuseeme@xx.com"); gson.toJson(admin, System.out);}
运行结果:
{"id":1,"name":"nowuseeme","admin_email":"nowuseeme@xx.com"}
JsonDeserializer
@Testpublic void testDeserializer(){ Gson gson = new GsonBuilder().registerTypeAdapter(Admin.class, new JsonDeserializer<Admin>() { @Override public Admin deserialize(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext)throws JsonParseException { Admin admin = new Admin(); JsonObject jsonObject = jsonelement.getAsJsonObject(); admin.setId(jsonObject.get("id").getAsInt()); admin.setName(jsonObject.get("name").getAsString()); admin.setEmailAddress(jsonObject.get("emailAddress").getAsString()+"23333"); return admin; } }).create(); String json = "{\"id\":\"1\",\"name\":\"nowuseeme\",\"emailAddress\":\"nowuseeme@xx.com\"}"; Admin admin = gson.fromJson(json, Admin.class); System.out.println(admin.getEmailAddress()); //nowuseeme@xx.com23333}
TypeAdapterFactory
@JsonAdapter注解
参考
http://www.jianshu.com/p/e740196225a4
http://www.jianshu.com/p/d62c2be60617
http://blog.csdn.net/chunqiuwei/article/details/49160321
http://blog.csdn.net/chunqiuwei/article/details/49401733
http://www.jianshu.com/p/fc5c9cdf3aab
- java解析json(四):gson
- Gson解析Json 四
- Json Gson java解析json
- java : 用 gson 解析 JSON
- JSON的解析[Java-JSON、FastJSON、GSON]
- Java创建和解析Json数据方法(四)——Google Gson包的使用
- Java-使用gson解析JSON数据
- java json字符串解析(Gson)
- JAVA使用GSON解析JSON数据
- JSON教程之GSON基本解析(Gson-Java)
- JSON教程之GSON基本解析(Java-Gson)
- Java-Gson解析-03 使用gson生产json字符串
- JSON解析 GSON解析
- json解析:gson解析json
- Java-json解析:GSON解析,java bean 编写
- Gson解析Json数据
- 使用Gson解析Json
- Android JSON Gson 解析
- 使用Enumeration和Iterator遍历集合类详解
- 详解 QT 布局管理界面 图文并茂
- 获取android项目中sqlite数据库
- Android Error:Execution failed for task ':app:transformClassesWithDexForRelease'错误小记
- 如何快速转载CSDN中的博客
- java解析json(四):gson
- iOS layout 动画
- UVA-673 括号匹配--栈
- windows 豆沙绿参数
- cmd命令大全
- MongoDB 关于索引操作命令实例详解
- js/jq解析json
- zip明文攻击
- 网络流24题 题解 (部分) 更新中