1、=========================

https://segmentfault.com/a/1190000009523164

  1. package com.thunisoft.maybee.engine.utils;
  2.  
  3. import com.google.gson.Gson;
  4.  
  5. import java.lang.reflect.ParameterizedType;
  6. import java.lang.reflect.Type;
  7. import java.util.List;
  8.  
  9. /**
  10. * Json2Bean / Json2List / Json2List<T>
  11. *
  12. * @author hcq
  13. */
  14. public class GsonUtil {
  15.  
  16. private GsonUtil() {
  17.  
  18. }
  19.  
  20. /**
  21. * Json 转为 bean
  22. *
  23. * @param json
  24. * @param type
  25. * @param <T>
  26. * @return
  27. */
  28. public static <T> T bean4Json(String json, Class<T> type) {
  29. Gson gson = new Gson();
  30. return gson.fromJson(json, type);
  31.  
  32. }
  33.  
  34. /**
  35. * Json 转为 List<bean>
  36. *
  37. * @param json
  38. * @param typeclazz
  39. * @param <T>
  40. * @return
  41. */
  42. public static <T> List<T> list4Json(String json, Class<T> typeclazz) {
  43. ParameterizedTypeImpl type = new ParameterizedTypeImpl(typeclazz);
  44. Gson gson = new Gson();
  45. return gson.fromJson(json, type);
  46. }
  47.  
  48. /**
  49. * 参数类型转换
  50. */
  51. private static class ParameterizedTypeImpl implements ParameterizedType {
  52. private Class clazz;
  53.  
  54. public ParameterizedTypeImpl(Class clz) {
  55. clazz = clz;
  56. }
  57.  
  58. public Type[] getActualTypeArguments() {
  59. return new Type[]{clazz};
  60. }
  61.  
  62. public Type getRawType() {
  63. return List.class;
  64. }
  65.  
  66. public Type getOwnerType() {
  67. return null;
  68. }
  69. }
  70.  
  71. public static void main(String[] args) {
  72.  
  73. String json1 = "{\"id\":1,\"name\":\"eric\"}";
  74. String json2 = "[{\"id\":1,\"name\":\"eric\"},{\"id\":2,\"name\":\"john\"}]";
  75. String json3 = "{\"page\":1,\"size\":10,\"total\":2,\"data\":[{\"id\":1,\"name\":\"eric\"},{\"id\":2,\"name\":\"john\"}]}";
  76.  
  77. String helloworld = "helloworld!";
  78. String bl = "false";
  79. String integer = "123";
  80. String db = "23423d";
  81.  
  82. User user = GsonUtil.bean4Json(json1, User.class);
  83. List<User> lists = GsonUtil.list4Json(json2, User.class);
  84. Page<User> page = GsonUtil.bean4Json(json3, Page.class);
  85.  
  86. String res1 = GsonUtil.bean4Json(helloworld, String.class);
  87. Boolean res2 = GsonUtil.bean4Json(bl, Boolean.class);
  88. Integer res3 = GsonUtil.bean4Json(integer, Integer.class);
  89. Double res4 = GsonUtil.bean4Json(db, Double.class);
  90.  
  91. System.out.println("user:" + user);
  92. System.out.println("lists:" + lists);
  93. System.out.println("page:" + page);
  94.  
  95. User user1 = lists.get(0);
  96. System.out.println("user1:" + user1);
  97.  
  98. System.out.println("===");
  99.  
  100. System.out.println(res1);
  101. System.out.println(res2);
  102. System.out.println(res3);
  103. System.out.println(res4);
  104. }
  105.  
  106. private class Page<T> {
  107. private int page;
  108.  
  109. private int size;
  110.  
  111. private int total;
  112.  
  113. private List<T> data;
  114.  
  115. public int getPage() {
  116. return page;
  117. }
  118.  
  119. public void setPage(int page) {
  120. this.page = page;
  121. }
  122.  
  123. public int getSize() {
  124. return size;
  125. }
  126.  
  127. public void setSize(int size) {
  128. this.size = size;
  129. }
  130.  
  131. public int getTotal() {
  132. return total;
  133. }
  134.  
  135. public void setTotal(int total) {
  136. this.total = total;
  137. }
  138.  
  139. public List<T> getData() {
  140. return data;
  141. }
  142.  
  143. public void setData(List<T> data) {
  144. this.data = data;
  145. }
  146.  
  147. @Override
  148. public String toString() {
  149. return "User [page=" + page + ", size=" + size + ", total=" + total + ", data=" + data + "]";
  150. }
  151. }
  152.  
  153. private class User {
  154. private int id;
  155.  
  156. private String name;
  157.  
  158. public int getId() {
  159. return id;
  160. }
  161.  
  162. public void setId(int id) {
  163. this.id = id;
  164. }
  165.  
  166. public String getName() {
  167. return name;
  168. }
  169.  
  170. public void setName(String name) {
  171. this.name = name;
  172. }
  173.  
  174. @Override
  175. public String toString() {
  176. return "User [id=" + id + ", name=" + name + "]";
  177. }
  178. }
  179. }

  

2/=========================

https://www.jianshu.com/p/701ae370f959

  1. 通常情况下,Server端返回的json数据应该可以一次性完全解析,但是要是遇到server返回的json里又包含json字符串就得自己再手动解析一次了。
  2.  
  3. 我们知道json字符串解析成模型类型很简单,但是如果要把json数组字符串解析List对象,应该怎么办呢?
  4.  
  5. 举一个实际的例子:
  6.  
  7. [
  8. {
  9. "name": "zhaoxa",
  10. "score": 100
  11. },
  12. {
  13. "name": "zhaoxa2",
  14. "score": 76
  15. },
  16. {
  17. "name": "zhaoxa3",
  18. "score": 99
  19. },
  20. {
  21. "name": "zhaoxa4",
  22. "score": 48
  23. }
  24. ]
  25. 根据这个json字符串列表,我们设计名为Student的数据模型,Parcelable接口可以使用AS插件一键生成:
  26.  
  27. public class Student implements Parcelable{
  28. String name;
  29. int score;
  30.  
  31. public Student(String name, int score) {
  32. this.name = name;
  33. this.score = score;
  34. }
  35.  
  36. public String getName() {
  37. return name;
  38. }
  39.  
  40. public void setName(String name) {
  41. this.name = name;
  42. }
  43.  
  44. public int getScore() {
  45. return score;
  46. }
  47.  
  48. public void setScore(int score) {
  49. this.score = score;
  50. }
  51.  
  52. @Override
  53. public int describeContents() {
  54. return 0;
  55. }
  56.  
  57. @Override
  58. public void writeToParcel(Parcel dest, int flags) {
  59. dest.writeString(this.name);
  60. dest.writeInt(this.score);
  61. }
  62.  
  63. protected Student(Parcel in) {
  64. this.name = in.readString();
  65. this.score = in.readInt();
  66. }
  67.  
  68. public static final Creator<Student> CREATOR = new Creator<Student>() {
  69. @Override
  70. public Student createFromParcel(Parcel source) {
  71. return new Student(source);
  72. }
  73.  
  74. @Override
  75. public Student[] newArray(int size) {
  76. return new Student[size];
  77. }
  78. };
  79. }
  80. 现在开始着手解析这个json数组字符串。
  81.  
  82. 1. 先转成数组,再转成List
  83. 最常规的方法把jsonString转化为T[]数组,然后再使用Arrys.asList将数组转为List
  84.  
  85. Student[] array = new Gson().fromJson(jsonString,Student[].class);
  86. List<Student> list = Arrays.asList(array);
  87. Log.i("lxc"," ---> " + list);
  88. 通过断点,可以看到list下面的数据已经转为Student类型了。
  89.  
  90. 2. 使用TypeToken进行转化
  91. Type type = new TypeToken<List<Student>>(){}.getType();
  92. List<Student> list = new Gson().fromJson(jsonString,type);
  93.  
  94. 3. 如何使用泛型抽象
  95. 假设不只一个json数组字符串需要你解析,很显然重复的代码应该抽象成一个方法。
  96.  
  97. 假设现在有关于书籍的信息,json数组内容如下:
  98.  
  99. [
  100. {
  101. "author": "zhaoxa",
  102. "name": "如何入门android",
  103. "price": 100
  104. },
  105. {
  106. "author": "zhaoxa2",
  107. "name": "如何入门android2",
  108. "price": 76
  109. },
  110. {
  111. "author": "zhaoxa3",
  112. "name": "如何入门android3",
  113. "price": 99
  114. },
  115. {
  116. "author": "zhaoxa4",
  117. "name": "如何入门android4",
  118. "price": 48
  119. }
  120. ]
  121. 同样的,我们得新建一个Book类,难道必须得复制之前的代码进行操作么?能不能抽象一个泛型的方法出来,把json数组字符串转化成类。
  122.  
  123. 好的,应该可以的,我们进行以下尝试:
  124.  
  125. 第一次尝试
  126.  
  127. 报错了,fromJson不支持使用泛型解析。
  128.  
  129. 第二次尝试
  130. public <T> List<T> parseString2List(String json) {
  131. Type type = new TypeToken<List<T>>(){}.getType();
  132. List<T> list = new Gson().fromJson(jsonString,type);
  133. return list;
  134. }
  135. 嗯,没有报错,我们运行时断点看看list里的数据类型。
  136.  
  137. 我们通过这句话调用方法:
  138.  
  139. List<Student> list = parseString2List(jsonString);
  140.  
  141. 可以看到,list中的数据类型不是Student,而是LinkedTreeMapLinkedTreeMapGson库内部数据模型,换句话说我们的解析失败了,尝试着将parseString2List方法中的泛型T去掉,运行结果一样,说明Gson解析时不支持泛型。
  142.  
  143. 真的就没有办法了么,难道解析数组json必须得重复调用相似的代码?嗯,在接触ParameterizedType接口之前,你应该很难实现这个功能。但是现在知道了ParameterizedType接口,我们就有了第三次尝试。
  144.  
  145. 第三次尝试
  146. public <T> List<T> parseString2List(String json,Class clazz) {
  147. Type type = new ParameterizedTypeImpl(clazz);
  148. List<T> list = new Gson().fromJson(json, type);
  149. return list;
  150. }
  151.  
  152. private class ParameterizedTypeImpl implements ParameterizedType {
  153. Class clazz;
  154.  
  155. public ParameterizedTypeImpl(Class clz) {
  156. clazz = clz;
  157. }
  158.  
  159. @Override
  160. public Type[] getActualTypeArguments() {
  161. return new Type[]{clazz};
  162. }
  163.  
  164. @Override
  165. public Type getRawType() {
  166. return List.class;
  167. }
  168.  
  169. @Override
  170. public Type getOwnerType() {
  171. return null;
  172. }
  173. }
  174. 在调用的地方使用:
  175.  
  176. List<Student> list = parseString2List(jsonString, Student.class);
  177. List<Book> list2 = parseString2List(jsonString, Book.class);
  178. 断点查看解析结果,嗯,完美解析~
  179.  
  180. 好的,现在在回过头来看看,ParameterizedType的几个方法的含义吧,以HashMap<String,Integer>为例。
  181.  
  182. getActualTypeArguments 返回实际类型组成的数据,即new Type[]{String.class,Integer.class}
  183.  
  184. getRawType 返回原生类型,即 HashMap
  185.  
  186. getOwnerType 返回 Type 对象,表示此类型是其成员之一的类型。例如,如果此类型为 O<T>.I<S>,则返回 O<T> 的表示形式。 如果此类型为顶层类型,则返回 null。这里就直接返回null就行了。
  187.  
  188. <div align ="right">写于 9/7/2017 4:52:27 PM</div>
  189.  
  190. 作者:orzangleli
  191. 链接:https://www.jianshu.com/p/701ae370f959
  192. 來源:简书
  193. 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

json转实体,json转List实体,json转泛型实体的更多相关文章

  1. 记录--Gson、json转实体类、类转json

    需要导入Gson jar包 最近在做一个java web service项目,需要用到jason,本人对java不是特别精通,于是开始搜索一些java平台的json类库. 发现了google的gson ...

  2. @JsonInclude(Include.NON_NULL) resttemplate 传递实体参数时 序列化为json时 空字符串不参与序列化

    @JsonInclude(Include.NON_NULL) resttemplate 传递实体参数时 序列化为json时 空字符串不参与序列化 https://www.cnblogs.com/sup ...

  3. ASP.NET JSON的序列化和反序列化 之 Newtonsoft.Json

    我们用到的类库为:Newtonsoft.Json,通过VS工具中NuGet程序包可以下载. 一:对象转json-序列化 public class Student { public int ID { g ...

  4. JSON C# Class Generator是一个从JSON文本中生成C#内的应用程序

    JSON C# Class Generator是一个从JSON文本中生成C#内的应用程序 .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator   ...

  5. Json传递数据两种方式(json大全)

    1.Json传递数据两种方式(json大全)----------------------------字符串 var list1 = ["number","name&quo ...

  6. 问题:c# json解析;结果:c# 解析JSON的几种办法

    c# 解析JSON的几种办法 欲成为海洋大师,必知晓海中每一滴水的真名. 刚开始只是想找一个转换JSON数组的方法,结果在MSDN翻到一大把. 搜索过程中免不了碰到一大堆名词:WCF => Da ...

  7. fastjson: json对象,json对象数组,javabean对象,json字符串之间的相互转化

    fastjson: json对象,json对象数组,javabean对象,json字符串之间的相互转化 在开发过程中,经常需要和前端交互数据,数据交互的格式都是JSON,在此过程中免不了json字符串 ...

  8. json相关类库,java对象与json相互转换

    有效选择七个关于Java的JSON开源类库 转自:http://www.open-open.com/lib/view/open1397870197828.html 翻译: (英语原文:http://w ...

  9. JSON相关知识,转载:删除JSON中数组删除操作

    一:JSON是什么 JSONg格式:对象是一个无序的“名称/值”对的集合. 对象以括号开始,括号结束. 名称冒号分隔值. "名称/值"之间用逗号分隔 例: var people = ...

  10. 如何正确的使用json?如何在.Net中使用json?

    什么是json json是一种轻量级的数据交换格式,由N组键值对组成的字符串,完全独立于语言的文本格式. 为什么要使用json 在很久很久以前,调用第三方API时,我们通常是采用xml进行数据交互,但 ...

随机推荐

  1. ELK 中的elasticsearch 集群的部署

    本文内容 背景 ES集群中第一个master节点 ES slave节点 本文总结 Elasticsearch(以下简称ES)搭建集群的经验.以 Elasticsearch-rtf-2.2.1 版本为例 ...

  2. logstash 中multiline插件的用法

    input { stdin { codec =>multiline { charset=>... #可选 字符编码 max_bytes=>... #可选 bytes类型 设置最大的字 ...

  3. Fiddler 抓取 app 网络请求数据

    通过设置代理在同一个路由器下可以通过 Fiddler 实现抓取 app 的网络数据 步骤如下: 手机(Android ,iOS 都可以)和 PC 连到同一个路由器 对手机连接的 WIFI 设置代理,代 ...

  4. 在eclipse-oxygen-sts中,关于快捷键[CTRL + SHIFT + O]失效的问题

    这是sts的一个bug,没关系,重新设置接口 按照如图位置修改即可 下图截自于stackoverflow

  5. vuex入门教程和思考

    Vuex是什么 首先对于vuex是什么,我先引用下官方的解释. Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可 ...

  6. jQuery中 index() 方法的使用

    假设一个集合中有10个元素,源生js在添加事件的时候,会使用for循环,里面的i的值,就是当前点击元素是集合中的第i个元素.在jquery中,获得i的值的方法如下: <ul id="a ...

  7. C#对Sql Server TEXT字段存储的实现(使用存储过程)

    1.这里先准备数据库:在数据库中建立一个News数据表,字段为id,title,content2.建立用于插入news的存储过程:NewsInsert和NewsUpdate,代码如下: ),@cont ...

  8. Ctex中WinEdt经常弹出注册小窗口 解决办法

    使用WinEdt 7避免跳出“注册对话框” 在options菜单下点options…,在advanced configuration  =>  Event Handlers  下点Exit, 在 ...

  9. 【转帖】(一)unity4.6Ugui中文教程文档-------概要

    原帖至上,移步请戳:(一)unity4.6Ugui中文教程文档-------概要 unity4.6中的一个重要的升级就是GUI ,也把它称为UGUI ,废话我不多说,大家可以百度了解一下. 虽然现在处 ...

  10. vue项目的搭建

    ps: 想了解更多vue相关知识请点击VUE学习目录汇总 Vue作为前端三大框架之一截至到目前在github上以收获44,873颗星,足以说明其以悄然成为主流.16年10月Vue发布了2.x版本,经过 ...