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转泛型实体的更多相关文章

  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. java appium webview切换处理

    Set<String> contexts = driver.getContextHandles(); for(String item :contexts){ // NATIVE_APP / ...

  2. elk 使用中遇到的问题(kafka 重复消费)

    问题描述: 在使用过程中,当遇到大量报错的时候,我们到eagle后台看到报错的那个consumer的消费情况到到lag 远远大于0(正常情况应该为0),activie  节点没有,kibana面板上没 ...

  3. IOS 项目的瘦身工具

    http://maniacdev.com/2014/01/tool-a-ruby-gem-allowing-you-to-quickly-find-and-remove-unused-imports- ...

  4. IOS6 IOS7 Mapkit draw Rout(地图划线)

    IOS7  比较简单 CLLocationCoordinate2D  _start2D; CLLocationCoordinate2D  _end2D; NSArray *_routes; IOS6 ...

  5. php实现文件下载代码一例

    php实现文件下载代码 需要用到header函数来发送相关信息给客户端浏览器,同时再结合filesize函数来读取文件大小并进行下载操作.简单的文件下载只需要使用HTML的连接标记<a>, ...

  6. 行为类模式(五):中介者(Mediator)

    定义 定义一个中介对象来封装系列对象之间的交互.中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互. 试想一下,如果多个类之间相互都有引用,那么当其中一个类修改 ...

  7. 一文读懂Redis持久化

    Redis 是一个开源( BSD 许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件.它支持的数据类型很丰富,如字符串.链表.集合.以及散列等,并且还支持多种排序功能. 什么叫持久 ...

  8. OpenStack大规模部署详解

    https://blog.csdn.net/karamos/article/details/80130443 0.前言今年的2月22日,OpenStack发布了15个版本Ocata. 走过了7年的发展 ...

  9. [Windows Azure] How to use the Queue Storage Service

    How to use the Queue Storage Service version 1.7 version 2.0 This guide will show you how to perform ...

  10. 【嵌入式】FS2410非操作系统外围资源测试

    在刚接触FS2410时,其实这个测试也没有多大意义,但是对于以后来说,当一个产品做成功时,产品测试还是一个必须经过的一个阶段,所以这个流程还是有必要走一下! 在非操作系统下,主要进行RTC测试,按键测 ...