Gson 操作
来源:互联网 发布:网络好但是迅雷下载慢 编辑:程序博客网 时间:2024/06/06 02:18
- bean、list 和gson转换
/** * 测试类 * Created by hyman on 2017/5/22. */public class StudentTest { public static void main(String[] args) { Gson gson = new Gson(); Student student1 = new Student(); student1.setId("101"); student1.setUserName("hyman"); student1.setBirthday(new Date()); System.out.println("---------简单java对象的转换"); String s1 = gson.toJson(student1); //bean--->json System.out.println("简单Bean转换Gson==" + s1); //json--->bean Student student = gson.fromJson(s1, Student.class); System.out.println("josn转换为bean==" + student); Student student2 = new Student(); student2.setId("102"); student2.setUserName("hyq"); student2.setBirthday(new Date()); Student student3 = new Student(); student3.setId("103"); student3.setUserName("LiSi"); student3.setBirthday(new Date()); List<Student> list = new ArrayList<Student>(); list.add(student1); list.add(student2); list.add(student3); //list转化为json System.out.println("--------带泛型的list之间的转化-----------"); String s2 = gson.toJson(list); System.out.println("带泛型的list转化为json==" + s2); //json转化为带泛型的list List<Student> retList = gson.fromJson(s2,new TypeToken<List<Student>>(){}.getType()); for(Student stu:retList){ System.out.println(stu); } }}
- io流 与Gson转化
try(Writer writer = new OutputStreamWriter(new FileOutputStream("Output.json") , "UTF-8")){ Gson gson = new GsonBuilder().create(); gson.toJson("Hello", writer); gson.toJson(123, writer); }
public static void main(String[] args) throws IOException { try(Reader reader = new InputStreamReader(JsonToJava.class.getResourceAsStream("/Server1.json"), "UTF-8")){ Gson gson = new GsonBuilder().create(); Person p = gson.fromJson(reader, Person.class); System.out.println(p); } }
- List Map转Json字符串
public static void main(String[] args) throws Exception { Gson gson = new Gson(); List<String> list = Arrays.asList("1", "a", "3", "rt", "5"); log("---->list convert jsonStr:" + gson.toJson(list)); Map<String, Object> content = new HashMap<String, Object>(); content.put("name", "xuanyouwu"); content.put("age", "26"); log("---->map convert jsonStr:" + gson.toJson(content)); }
public class GsonTest2 { private static void log(String msg) { System.out.println(msg); } public static void main(String[] args) throws Exception { String studentJsonStr="{\"name\":\"xuanyouwu\",\"age\":26}"; log("------>studentJsonStr:"+studentJsonStr); JsonPrimitive jsonPrimitive=new JsonPrimitive(studentJsonStr); log("------>jsonPrimitive:"+jsonPrimitive); log("------>jsonPrimitive:"+jsonPrimitive.toString()); log("------>jsonPrimitive:"+jsonPrimitive.getAsString()); JsonPrimitive jsonPrimitive2=new JsonPrimitive("this is String"); log("------>jsonPrimitive2:"+jsonPrimitive2); log("------>jsonPrimitive2:"+jsonPrimitive2.toString()); log("------>jsonPrimitive2:"+jsonPrimitive2.getAsString()); }
Gson注释
- 1.1@SerializedName注解
- 该注解能指定该字段在JSON中对应的字段名称
public class Box { @SerializedName("w") private int width; @SerializedName("h") private int height; @SerializedName("d") private int depth; // Methods removed for brevity}
- 2.@Expose注解
- 该注解能够指定该字段是否能够序列化或者反序列化,默认的是都支持(true)。
public class Account { @Expose(deserialize = false) private String accountNumber; @Expose private String iban; @Expose(serialize = false) private String owner; @Expose(serialize = false, deserialize = false) private String address; private String pin;}
- 需要注意的通过 builder.excludeFieldsWithoutExposeAnnotation()方法是该注解生效。
final GsonBuilder builder = new GsonBuilder(); builder.excludeFieldsWithoutExposeAnnotation(); final Gson gson = builder.create();
- 3.@Since和@Until注解
- Since代表“自从”,Until 代表”一直到”。它们都是针对该字段生效的版本。比如说 @Since(1.2)代表从版本1.2之后才生效,@Until(0.9)代表着在0.9版本之前都是生效的。
public class SoccerPlayer { private String name; @Since(1.2) private int shirtNumber; @Until(0.9) private String country; private String teamName; // Methods removed for brevity}
Gson 序列化
- 1 序列化方案1
- 采用上面提到的@SerializedName注解。
public class Book { private String[] authors; @SerializedName("isbn-10") private String isbn10; @SerializedName("isbn-13") private String isbn13; private String title; //为了代码简洁,这里移除getter和setter方法等}
- 序列化方案2
- 利用JsonSerializer类
- 序列化方案2
public class BookSerialiser implements JsonSerializer { @Override public JsonElement serialize(final Book book, final Type typeOfSrc, final JsonSerializationContext context) { final JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("title", book.getTitle()); jsonObject.addProperty("isbn-10", book.getIsbn10()); jsonObject.addProperty("isbn-13", book.getIsbn13()); final JsonArray jsonAuthorsArray = new JsonArray(); for (final String author : book.getAuthors()) { final JsonPrimitive jsonAuthor = new JsonPrimitive(author); jsonAuthorsArray.add(jsonAuthor); } jsonObject.add("authors", jsonAuthorsArray); return jsonObject; }}
- JsonSerializer是一个接口,我们需要提供自己的
public interface JsonSerializer<T> {/** *Gson 会在解析指定类型T数据的时候触发当前回调方法进行序列化 * * @param T 需要转化为Json数据的类型,对应上面的Book * @return 返回T指定的类对应JsonElement */public JsonElement serialize(T src, Type typeOfSrc, JsonSerializationContext context);}
- 首先在上面的代码中,我们需要创建的是一个JsonElement对象,这里对应Book是一个对象,所以创建一个JsonObject类型。
final JsonObject jsonObject = new JsonObject();
- 然后我们将相应字段里面的数据填充到jsonObject里面。
jsonObject.addProperty...jsonObject.add...
- 所以最后返回的还是一个JsonElement 类型,这里对应的是jsonObject。完成了javaBean->JSON数据的转化。
- 同样需要配置,
// Configure GSON final GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(Book.class, new BookSerialiser()); gsonBuilder.setPrettyPrinting(); final Gson gson = gsonBuilder.create(); final Book javaPuzzlers = new Book(); javaPuzzlers.setTitle("Java Puzzlers: Traps, Pitfalls, and Corner Cases"); javaPuzzlers.setIsbn10("032133678X"); javaPuzzlers.setIsbn13("978-0321336781"); javaPuzzlers.setAuthors(new String[] { "Joshua Bloch", "Neal Gafter" }); // Format to JSON final String json = gson.toJson(javaPuzzlers); System.out.println(json);
- 这里对应的是
gsonBuilder.registerTypeAdapter(Book.class, new BookSerialiser())
方法进行JsonSerializer的配置。在上面例子中,通过调用gsonBuilder.setPrettyPrinting()
;方法还告诉了 Gson 对生成的 JSON 对象进行格式化
Gson 反序列化
- 1 反序列化方案1
- 利用@SerializedName 注解
- 也就是说我们的实体类Book.java可以这么写:
public class Book { private String[] authors; @SerializedName("isbn-10") private String isbn10; @SerializedName(value = "isbn-13", alternate = {"isbn13","isbn.13"}) private String isbn13; private String title; //为了代码简洁,这里移除getter和setter方法等}
可以看到这里我们在@SerializedName 注解使用了一个value, alternate字段,value也就是默认的字段,对序列化和反序列化都有效,alternate只有反序列化才有效果。也就是说一般服务器返回给我们JSON数据的时候可能同样的一个图片,表示”image”,”img”,”icon”等,我们利用@SerializedName 中的alternate字段就能解决这个问题,全部转化为我们实体类中的图片字段。
- 2 反序列化方案2
- 我们在序列化的时候使用的是JsonSerialize ,这里对应使用JsonDeserializer
- 我们将解析到的json数据传递给Book的setter方法即可。
public class BookDeserializer implements JsonDeserializer<Book> { @Override public Book deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) throws JsonParseException { final JsonObject jsonObject = json.getAsJsonObject(); final JsonElement jsonTitle = jsonObject.get("title"); final String title = jsonTitle.getAsString(); final String isbn10 = jsonObject.get("isbn-10").getAsString(); final String isbn13 = jsonObject.get("isbn-13").getAsString(); final JsonArray jsonAuthorsArray = jsonObject.get("authors").getAsJsonArray(); final String[] authors = new String[jsonAuthorsArray.size()]; for (int i = 0; i < authors.length; i++) { final JsonElement jsonAuthor = jsonAuthorsArray.get(i); authors[i] = jsonAuthor.getAsString(); } final Book book = new Book(); book.setTitle(title); book.setIsbn10(isbn10); book.setIsbn13(isbn13); book.setAuthors(authors); return book; }}
- 和Gson序列化章节一样,我们这里接着分析我们是怎么将JSON数据解析(反序列化)为实体类的:
- 因为我们可以发现上面的JSON数据是一个{}大括号包围的,也就意味着这是一个Json对象。所以首先我们通过
final JsonObject jsonObject = json.getAsJsonObject()
;将我们的JsonElement转化为JsonObject - 通过
jsonObject.get("xxx").getAsString()
的形式获取相应String的值 - 通过
jsonObject.get("xx").getAsJsonArray()
;获取相应的json数组,并遍历出其中的相应字段值 - 通过setter方法,将获取到的值设置给Book类。
- 最终返回的是 Book的对象实例。完成了JSON->javaBean的转化同样需要配置
- 关于从本地流中读取Json数据可以使用 InputStreamReader完成
- 因为我们可以发现上面的JSON数据是一个{}大括号包围的,也就意味着这是一个Json对象。所以首先我们通过
// Configure Gson GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(Book.class, new BookDeserializer()); Gson gson = gsonBuilder.create(); // The JSON data try(Reader reader = new InputStreamReader(Main.class.getResourceAsStream("/part1/sample.json"), "UTF-8")){ // Parse JSON to Java Book book = gson.fromJson(reader, Book.class); System.out.println(book); }
阅读全文
0 0
- Gson操作
- Gson 操作
- Android之Gson操作
- Gson操作Map
- gson操作Json
- 使用Gson操作json数据
- Android之gson操作系列1
- Gson
- Gson
- Gson
- Gson
- GSON
- Gson
- Gson
- Gson
- Gson
- gson
- GSON
- 二、vault
- HDU 1541 Stars
- 蓝桥杯 历届试题 网络寻路(暴力 dfs)
- 第七届蓝桥杯决赛真题
- 第八届省赛K题(贪心+01背包)
- Gson 操作
- 集合框架(二)
- C 文件读写
- flashback
- PAT-A-1053. Path of Equal Weight (30)
- AOJ.805 2016算法课期末考试1
- Sarsa(λ) and Q(λ) in Tabular Case
- webpack---用到过的加载器loader
- 三、vault