TypeToken分析(json字符串- list对象)

简介: TypeToken分析(json字符串- list对象)

注意本篇数据交换- JSON(教你学会什么是JSON)

配套起来观看更好

json字符串 -> list对象

(1) 如果需要把json字符串 转成 集合这样复杂的类型, 需要使用gson提供的一个类

(2) TypeToken , 是一个自定义泛型类, 然后通过TypeToken来指定我们需要转换成的类型

com.google.gson.reflect
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class TypeToken<T> {
    final Class<? super T> rawType;
    final Type type;
    final int hashCode;
    protected TypeToken() {
        this.type = getSuperclassTypeParameter(this.getClass());
        this.rawType = Types.getRawType(this.type);
        this.hashCode = this.type.hashCode();
    }

分析一

(1) 返回类型的完整路径java.util.List<com.wyxdu.json.Book>

(2) gson的设计者,需要得到类型的完整路径,然后进行底层反射

(3) 所以gson 设计者就提供TypeToken, 来搞定.

分析二

(1) 如果我们 new TypeToken<List>() 提示’TypeToken()’ has protected access in ‘com.google.gson.reflect.TypeToken’

(2) 因为TypeToken 的无参构造器是protected , 而 new TypeToken<List>() 就是调用其无参构造器

(3) 根据java基础, 如果一个方法是protected ,而且不在同一个包, 是不能直接访问的, 因此报错

(4) 为什么 new TypeToken<List>(){} 使用就可以,这里就涉及到匿名内部类的知识.

(5) 当 new TypeToken<List>(){} 其实这个类型就是不是 TypeToken 而是一个匿名内部类(子类)

(6) 而且这个匿名内部类是有自己的无参构造器(隐式), 根据java基础规则 当执行子类的无参构造器时, 默认super();

模拟实现

首先

建立一个包然后创建一个类 我这里就是Text/T1.java

package t1;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class A<T> {
    protected A() {
        System.out.println("A的protected A()被调用...");
    }
}

其次

再建立一个包然后创建一个类 我这里就是Text2/T2.java

package t2;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import t1.A;
public class Test {
    public static void main(String[] args) {
        //'A()' has protected access in 'com.t1.A'
        A a = new A<String>(){};
        System.out.println(a.getClass());//Test$1
    }
}

如果直接调用会报错 ‘A()’ has protected access in ‘t1.A’

  1. 因为A类和Test类不在同一个包
  2. 就不能访问A类的protected 方法,包括构造器
  3. A(){} 就是一个匿名内部类, 可以理解成是A类子类
  4. A(){} 匿名内部类,有一个隐式的无参构造器,根据java基础 无参构造器 有默认super()
  5. 当你执行 new A(){} 会调用到A类的无参的protected 构造器

总结

当我们需要调用其他包下的受保护的方法时我们应该采用匿名内部类的方式去调用 相当于是创建了一个A类的子类


目录
相关文章
|
1月前
|
JSON 前端开发 JavaScript
json字符串如何转为list对象?
json字符串如何转为list对象?
249 7
|
1月前
|
JSON JavaScript 前端开发
js如何格式化一个JSON对象?
js如何格式化一个JSON对象?
83 3
|
2月前
|
XML JSON JavaScript
JSON对象的stringify()和parse()方法使用
本文阐述了JSON对象的`stringify()`和`parse()`方法的用法,包括如何将JavaScript对象转换为JSON字符串,以及如何将JSON字符串解析回JavaScript对象,并讨论了转换过程中需要注意的事项。
JSON对象的stringify()和parse()方法使用
|
2月前
|
JSON 前端开发 中间件
React读取properties配置文件转化为json对象并使用在url地址中
本文介绍了如何在React项目中读取properties配置文件,将其内容转化为JSON对象,并在请求URL地址时使用这些配置。文章详细说明了异步读取文件、处理字符串转换为JSON对象的过程,并提供了一个封装函数,用于在发起请求前动态生成配置化的URL地址。
84 1
|
2月前
|
JSON 数据格式 Python
6-1|Python如何将json转化为字符串写到文件内 还保留json格式
6-1|Python如何将json转化为字符串写到文件内 还保留json格式
|
1月前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
17天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
21天前
|
JSON 缓存 前端开发
PHP如何高效地处理JSON数据:从编码到解码
在现代Web开发中,JSON已成为数据交换的标准格式。本文探讨了PHP如何高效处理JSON数据,包括编码和解码的过程。通过简化数据结构、使用优化选项、缓存机制及合理设置解码参数等方法,可以显著提升JSON处理的性能,确保系统快速稳定运行。
|
14天前
|
JSON API 数据安全/隐私保护
拍立淘按图搜索API接口返回数据的JSON格式示例
拍立淘按图搜索API接口允许用户通过上传图片来搜索相似的商品,该接口返回的通常是一个JSON格式的响应,其中包含了与上传图片相似的商品信息。以下是一个基于淘宝平台的拍立淘按图搜索API接口返回数据的JSON格式示例,同时提供对其关键字段的解释
|
1月前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
在Java中处理JSON数据:Jackson与Gson库比较