先附个链接:http://www.jianshu.com/p/e740196225a4
先上user类
public class User { public String name; public int age; //obj和json互转时候,属性名也可以是mail_adress @SerializedName("email_address") //@SerializedName(value = "emailAddress", alternate = {"email", "email_address"}) //这一行是为emailAddress设置别名,当上面的三个属性(email_address、email、emailAddress)都中出现任意一个时均可以得到正确的结果。 //注:当多种情况同时出时,以最后一个出现的值为准。 public String emailAddress; ... }
一、Gson的基本用法
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 //POJO类的生成与解析 User user = new User("怪盗kidou", 245, "guaidao@xiaomi.com"); String jsonObject = gson.toJson(user); String jsonString = "{\"name\":\"怪盗kidou\",\"age\":24,\"email_address\":\"emailAddress@xiaomi.com\"}"; user = gson.fromJson(jsonString, User.class); //转json数组和List String jsonStringArr = "[{\"name\":\"怪盗kidou\",\"age\":24,\"email_address\":\"emailAddress@xiaomi.com\"},{\"name\":\"怪盗kidou1\",\"age\":25,\"email_address\":\"emailAddress1@xiaomi.com\"}]"; User[] uers = gson.fromJson(jsonStringArr, User[].class); List<User> userList = gson.fromJson(jsonStringArr, new TypeToken<List<User>>() { }.getType()); //json转map String mapJson = "{\"name\":\"怪盗kidou\",\"age\":24,\"email_address\":\"emailAddress@xiaomi.com\"}"; Map<String, String> map = gson.fromJson(mapJson, Map.class); // 也可以下面这样写,这样写的意思是防止范型擦除 // Map<String, String> map = gson.fromJson(mapJson, new TypeToken<Map<String,String>>(){}.getType());
二、手动转json字符串
//手动json转map对象 String json = "{\"name\":\"怪盗kidou\",\"age\":\"24\"}"; 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 IOException } } reader.endObject();
三、Gson的高级用法:使用GsonBuilder定制
//使用GsonBuilder生成定制的gson final List<String> ignoreFields = Arrays.asList(new String[]{"name"}); gson = new GsonBuilder() .serializeNulls() //序列化null .setDateFormat("yyyy-MM-dd") // 设置日期时间格式,另有2个重载方法 // 在序列化和反序化时均生效 .disableInnerClassSerialization() // 禁此序列化内部类 .generateNonExecutableJson() //生成不可执行的Json(多了 )]}' 这4个字符) .disableHtmlEscaping() //禁止转义html标签 .setPrettyPrinting()//格式化输出 .excludeFieldsWithoutExposeAnnotation()//根据@Expose决定是否过滤字段 .setExclusionStrategies(new ExclusionStrategy() { //下面两个函数一个是过滤字段,一个是过滤类,返回true过滤,返回false不过滤 //其中 ignoreFileds是要过滤的字段集合 @Override public boolean shouldSkipField(FieldAttributes fieldAttributes) { return ignoreFields.contains(fieldAttributes.getName()); } @Override public boolean shouldSkipClass(Class<?> clazz) { return clazz.getName().equals(Date.class.getName()); } })//序列化和反序列化时属性字段的别名, .setFieldNamingStrategy(new FieldNamingStrategy() { @Override public String translateName(Field field) { if (field.getName().equals("emailAddress")) return "email_address"; else return field.getName(); } }) .create(); //注意,下面的必须使用GsonBuilder.excludeFieldsWithoutExposeAnnotation().create()生成的gson才有效 //@Expose // 需要导出的字段加,不导出的字段不加 //@Expose(deserialize = true,serialize = true) //序列化和反序列化都都生效,等价于上一条 //@Expose(deserialize = true,serialize = false) //反序列化时生效 //@Expose(deserialize = false,serialize = true) //序列化时生效 //@Expose(deserialize = false,serialize = false) // 和不写注解一样 //下面是最NB的TypeAdapter,可以接管序列化和发序列化的过程!!! //使用方法是,写一个继承自TypeAdapter的范型类 gson = new GsonBuilder().registerTypeAdapter(User.class, new UserTypeAdapter()).create(); String adapterString = "{\"name\":\"怪盗kidou\",\"age\":24,\"email_address\":\"emailAddress@xiaomi.com\"}"; user = gson.fromJson(adapterString, User.class); System.out.println(user);年龄是24+10 adapterString = gson.toJson(user); System.out.println(adapterString);年龄是34+10 //当然如果TypeAdapter如果配合@JsonAdapter(UserTypeAdapter.class)这个加在类的上注解使用就完美了! //放在类上后就可以用Gson gson=new Gson()就可以完美使用了!!!
public class UserTypeAdapter extends TypeAdapter<User> { @Override public void write(JsonWriter jsonWriter, User user) throws IOException { //obj转json jsonWriter.beginObject(); jsonWriter.name("name").value(user.name); //让年龄大10岁! jsonWriter.name("age").value(user.age + 10); jsonWriter.name("email").value(user.emailAddress); jsonWriter.endObject(); } @Override public User read(JsonReader jsonReader) throws IOException { //json转obj User user = new User(); jsonReader.beginObject(); while (jsonReader.hasNext()) { switch (jsonReader.nextName()) { case "name": user.name = jsonReader.nextString(); break; case "age": user.age = jsonReader.nextInt() + 10; break; case "email": case "email_address": case "emailAddress": user.emailAddress = jsonReader.nextString(); break; } } jsonReader.endObject(); return user; } }
四、过滤字段的方法(第二个最常用)
1.使用GsonBuilder.excludeFieldsWithoutExposeAnnotation()//根据@Expose决定是否过滤字段
2.使用GsonBuilder.setExclusionStrategies(new ExclusionStrategy() {
//下面两个函数一个是过滤字段,一个是过滤类,返回true过滤,返回false不过滤
//ignoreField是要过滤字段的集合list
@Override
public boolean shouldSkipField(FieldAttributes fieldAttributes) {
return ignoreFields.contains(fieldAttributes.getName());
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return clazz.getName().equals(Date.class.getName());
}
})