json转实体,json转List实体,json转泛型实体
1、=========================
https://segmentfault.com/a/1190000009523164
- package com.thunisoft.maybee.engine.utils;
- import com.google.gson.Gson;
- import java.lang.reflect.ParameterizedType;
- import java.lang.reflect.Type;
- import java.util.List;
- /**
- * Json2Bean / Json2List / Json2List<T>
- *
- * @author hcq
- */
- public class GsonUtil {
- private GsonUtil() {
- }
- /**
- * Json 转为 bean
- *
- * @param json
- * @param type
- * @param <T>
- * @return
- */
- public static <T> T bean4Json(String json, Class<T> type) {
- Gson gson = new Gson();
- return gson.fromJson(json, type);
- }
- /**
- * Json 转为 List<bean>
- *
- * @param json
- * @param typeclazz
- * @param <T>
- * @return
- */
- public static <T> List<T> list4Json(String json, Class<T> typeclazz) {
- ParameterizedTypeImpl type = new ParameterizedTypeImpl(typeclazz);
- Gson gson = new Gson();
- return gson.fromJson(json, type);
- }
- /**
- * 参数类型转换
- */
- private static class ParameterizedTypeImpl implements ParameterizedType {
- private Class clazz;
- public ParameterizedTypeImpl(Class clz) {
- clazz = clz;
- }
- public Type[] getActualTypeArguments() {
- return new Type[]{clazz};
- }
- public Type getRawType() {
- return List.class;
- }
- public Type getOwnerType() {
- return null;
- }
- }
- public static void main(String[] args) {
- String json1 = "{\"id\":1,\"name\":\"eric\"}";
- String json2 = "[{\"id\":1,\"name\":\"eric\"},{\"id\":2,\"name\":\"john\"}]";
- String json3 = "{\"page\":1,\"size\":10,\"total\":2,\"data\":[{\"id\":1,\"name\":\"eric\"},{\"id\":2,\"name\":\"john\"}]}";
- String helloworld = "helloworld!";
- String bl = "false";
- String integer = "123";
- String db = "23423d";
- User user = GsonUtil.bean4Json(json1, User.class);
- List<User> lists = GsonUtil.list4Json(json2, User.class);
- Page<User> page = GsonUtil.bean4Json(json3, Page.class);
- String res1 = GsonUtil.bean4Json(helloworld, String.class);
- Boolean res2 = GsonUtil.bean4Json(bl, Boolean.class);
- Integer res3 = GsonUtil.bean4Json(integer, Integer.class);
- Double res4 = GsonUtil.bean4Json(db, Double.class);
- System.out.println("user:" + user);
- System.out.println("lists:" + lists);
- System.out.println("page:" + page);
- User user1 = lists.get(0);
- System.out.println("user1:" + user1);
- System.out.println("===");
- System.out.println(res1);
- System.out.println(res2);
- System.out.println(res3);
- System.out.println(res4);
- }
- private class Page<T> {
- private int page;
- private int size;
- private int total;
- private List<T> data;
- public int getPage() {
- return page;
- }
- public void setPage(int page) {
- this.page = page;
- }
- public int getSize() {
- return size;
- }
- public void setSize(int size) {
- this.size = size;
- }
- public int getTotal() {
- return total;
- }
- public void setTotal(int total) {
- this.total = total;
- }
- public List<T> getData() {
- return data;
- }
- public void setData(List<T> data) {
- this.data = data;
- }
- @Override
- public String toString() {
- return "User [page=" + page + ", size=" + size + ", total=" + total + ", data=" + data + "]";
- }
- }
- private class User {
- private int id;
- private String name;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- @Override
- public String toString() {
- return "User [id=" + id + ", name=" + name + "]";
- }
- }
- }
2/=========================
https://www.jianshu.com/p/701ae370f959
- 通常情况下,Server端返回的json数据应该可以一次性完全解析,但是要是遇到server返回的json里又包含json字符串就得自己再手动解析一次了。
- 我们知道json字符串解析成模型类型很简单,但是如果要把json数组字符串解析List对象,应该怎么办呢?
- 举一个实际的例子:
- [
- {
- "name": "zhaoxa",
- "score": 100
- },
- {
- "name": "zhaoxa2",
- "score": 76
- },
- {
- "name": "zhaoxa3",
- "score": 99
- },
- {
- "name": "zhaoxa4",
- "score": 48
- }
- ]
- 根据这个json字符串列表,我们设计名为Student的数据模型,Parcelable接口可以使用AS插件一键生成:
- public class Student implements Parcelable{
- String name;
- int score;
- public Student(String name, int score) {
- this.name = name;
- this.score = score;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getScore() {
- return score;
- }
- public void setScore(int score) {
- this.score = score;
- }
- @Override
- public int describeContents() {
- return 0;
- }
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeString(this.name);
- dest.writeInt(this.score);
- }
- protected Student(Parcel in) {
- this.name = in.readString();
- this.score = in.readInt();
- }
- public static final Creator<Student> CREATOR = new Creator<Student>() {
- @Override
- public Student createFromParcel(Parcel source) {
- return new Student(source);
- }
- @Override
- public Student[] newArray(int size) {
- return new Student[size];
- }
- };
- }
- 现在开始着手解析这个json数组字符串。
- 1. 先转成数组,再转成List
- 最常规的方法把jsonString转化为T[]数组,然后再使用Arrys.asList将数组转为List。
- Student[] array = new Gson().fromJson(jsonString,Student[].class);
- List<Student> list = Arrays.asList(array);
- Log.i("lxc"," ---> " + list);
- 通过断点,可以看到list下面的数据已经转为Student类型了。
- 2. 使用TypeToken进行转化
- Type type = new TypeToken<List<Student>>(){}.getType();
- List<Student> list = new Gson().fromJson(jsonString,type);
- 3. 如何使用泛型抽象
- 假设不只一个json数组字符串需要你解析,很显然重复的代码应该抽象成一个方法。
- 假设现在有关于书籍的信息,json数组内容如下:
- [
- {
- "author": "zhaoxa",
- "name": "如何入门android",
- "price": 100
- },
- {
- "author": "zhaoxa2",
- "name": "如何入门android2",
- "price": 76
- },
- {
- "author": "zhaoxa3",
- "name": "如何入门android3",
- "price": 99
- },
- {
- "author": "zhaoxa4",
- "name": "如何入门android4",
- "price": 48
- }
- ]
- 同样的,我们得新建一个Book类,难道必须得复制之前的代码进行操作么?能不能抽象一个泛型的方法出来,把json数组字符串转化成类。
- 好的,应该可以的,我们进行以下尝试:
- 第一次尝试
- 报错了,fromJson不支持使用泛型解析。
- 第二次尝试
- public <T> List<T> parseString2List(String json) {
- Type type = new TypeToken<List<T>>(){}.getType();
- List<T> list = new Gson().fromJson(jsonString,type);
- return list;
- }
- 嗯,没有报错,我们运行时断点看看list里的数据类型。
- 我们通过这句话调用方法:
- List<Student> list = parseString2List(jsonString);
- 可以看到,list中的数据类型不是Student,而是LinkedTreeMap,LinkedTreeMap是Gson库内部数据模型,换句话说我们的解析失败了,尝试着将parseString2List方法中的泛型T去掉,运行结果一样,说明Gson解析时不支持泛型。
- 真的就没有办法了么,难道解析数组json必须得重复调用相似的代码?嗯,在接触ParameterizedType接口之前,你应该很难实现这个功能。但是现在知道了ParameterizedType接口,我们就有了第三次尝试。
- 第三次尝试
- public <T> List<T> parseString2List(String json,Class clazz) {
- Type type = new ParameterizedTypeImpl(clazz);
- List<T> list = new Gson().fromJson(json, type);
- return list;
- }
- private class ParameterizedTypeImpl implements ParameterizedType {
- Class clazz;
- public ParameterizedTypeImpl(Class clz) {
- clazz = clz;
- }
- @Override
- public Type[] getActualTypeArguments() {
- return new Type[]{clazz};
- }
- @Override
- public Type getRawType() {
- return List.class;
- }
- @Override
- public Type getOwnerType() {
- return null;
- }
- }
- 在调用的地方使用:
- List<Student> list = parseString2List(jsonString, Student.class);
- List<Book> list2 = parseString2List(jsonString, Book.class);
- 断点查看解析结果,嗯,完美解析~
- 好的,现在在回过头来看看,ParameterizedType的几个方法的含义吧,以HashMap<String,Integer>为例。
- getActualTypeArguments 返回实际类型组成的数据,即new Type[]{String.class,Integer.class}
- getRawType 返回原生类型,即 HashMap
- getOwnerType 返回 Type 对象,表示此类型是其成员之一的类型。例如,如果此类型为 O<T>.I<S>,则返回 O<T> 的表示形式。 如果此类型为顶层类型,则返回 null。这里就直接返回null就行了。
- <div align ="right">写于 9/7/2017 4:52:27 PM</div>
- 作者:orzangleli
- 链接:https://www.jianshu.com/p/701ae370f959
- 來源:简书
- 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
json转实体,json转List实体,json转泛型实体的更多相关文章
- 记录--Gson、json转实体类、类转json
需要导入Gson jar包 最近在做一个java web service项目,需要用到jason,本人对java不是特别精通,于是开始搜索一些java平台的json类库. 发现了google的gson ...
- @JsonInclude(Include.NON_NULL) resttemplate 传递实体参数时 序列化为json时 空字符串不参与序列化
@JsonInclude(Include.NON_NULL) resttemplate 传递实体参数时 序列化为json时 空字符串不参与序列化 https://www.cnblogs.com/sup ...
- ASP.NET JSON的序列化和反序列化 之 Newtonsoft.Json
我们用到的类库为:Newtonsoft.Json,通过VS工具中NuGet程序包可以下载. 一:对象转json-序列化 public class Student { public int ID { g ...
- JSON C# Class Generator是一个从JSON文本中生成C#内的应用程序
JSON C# Class Generator是一个从JSON文本中生成C#内的应用程序 .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator ...
- Json传递数据两种方式(json大全)
1.Json传递数据两种方式(json大全)----------------------------字符串 var list1 = ["number","name&quo ...
- 问题:c# json解析;结果:c# 解析JSON的几种办法
c# 解析JSON的几种办法 欲成为海洋大师,必知晓海中每一滴水的真名. 刚开始只是想找一个转换JSON数组的方法,结果在MSDN翻到一大把. 搜索过程中免不了碰到一大堆名词:WCF => Da ...
- fastjson: json对象,json对象数组,javabean对象,json字符串之间的相互转化
fastjson: json对象,json对象数组,javabean对象,json字符串之间的相互转化 在开发过程中,经常需要和前端交互数据,数据交互的格式都是JSON,在此过程中免不了json字符串 ...
- json相关类库,java对象与json相互转换
有效选择七个关于Java的JSON开源类库 转自:http://www.open-open.com/lib/view/open1397870197828.html 翻译: (英语原文:http://w ...
- JSON相关知识,转载:删除JSON中数组删除操作
一:JSON是什么 JSONg格式:对象是一个无序的“名称/值”对的集合. 对象以括号开始,括号结束. 名称冒号分隔值. "名称/值"之间用逗号分隔 例: var people = ...
- 如何正确的使用json?如何在.Net中使用json?
什么是json json是一种轻量级的数据交换格式,由N组键值对组成的字符串,完全独立于语言的文本格式. 为什么要使用json 在很久很久以前,调用第三方API时,我们通常是采用xml进行数据交互,但 ...
随机推荐
- ELK 中的elasticsearch 集群的部署
本文内容 背景 ES集群中第一个master节点 ES slave节点 本文总结 Elasticsearch(以下简称ES)搭建集群的经验.以 Elasticsearch-rtf-2.2.1 版本为例 ...
- logstash 中multiline插件的用法
input { stdin { codec =>multiline { charset=>... #可选 字符编码 max_bytes=>... #可选 bytes类型 设置最大的字 ...
- Fiddler 抓取 app 网络请求数据
通过设置代理在同一个路由器下可以通过 Fiddler 实现抓取 app 的网络数据 步骤如下: 手机(Android ,iOS 都可以)和 PC 连到同一个路由器 对手机连接的 WIFI 设置代理,代 ...
- 在eclipse-oxygen-sts中,关于快捷键[CTRL + SHIFT + O]失效的问题
这是sts的一个bug,没关系,重新设置接口 按照如图位置修改即可 下图截自于stackoverflow
- vuex入门教程和思考
Vuex是什么 首先对于vuex是什么,我先引用下官方的解释. Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可 ...
- jQuery中 index() 方法的使用
假设一个集合中有10个元素,源生js在添加事件的时候,会使用for循环,里面的i的值,就是当前点击元素是集合中的第i个元素.在jquery中,获得i的值的方法如下: <ul id="a ...
- C#对Sql Server TEXT字段存储的实现(使用存储过程)
1.这里先准备数据库:在数据库中建立一个News数据表,字段为id,title,content2.建立用于插入news的存储过程:NewsInsert和NewsUpdate,代码如下: ),@cont ...
- Ctex中WinEdt经常弹出注册小窗口 解决办法
使用WinEdt 7避免跳出“注册对话框” 在options菜单下点options…,在advanced configuration => Event Handlers 下点Exit, 在 ...
- 【转帖】(一)unity4.6Ugui中文教程文档-------概要
原帖至上,移步请戳:(一)unity4.6Ugui中文教程文档-------概要 unity4.6中的一个重要的升级就是GUI ,也把它称为UGUI ,废话我不多说,大家可以百度了解一下. 虽然现在处 ...
- vue项目的搭建
ps: 想了解更多vue相关知识请点击VUE学习目录汇总 Vue作为前端三大框架之一截至到目前在github上以收获44,873颗星,足以说明其以悄然成为主流.16年10月Vue发布了2.x版本,经过 ...