JSON、GSON
文章目录
什么是JSON
JSON(JavaScript Object Notation) 是一种与开发语言无关的、轻量级的 数据格式;重点记住,它是一种数据格式 ;
特点
非常易于人的阅读和编写,同时也很容易被程序解析 ;
JSON的数据结构 – Object
使用花括号 {} 括起来的键值对结构,其中 key 必须是 String 类型,value 为 任何 基本类型 或 数据结构 ;
其中键值对内部使用冒号 : 连接, 键值对之间使用逗号 , 连接 ;
JSON的数据结构 – Array
使用中括号 [] 括起来,元素之间使用逗号 , 分隔 ;
元素也是可以为 任何 类型 ;
JSON的数据结构 – 基本类型
JSON 的基本类型有 5 种:
string代表字符串 ,字符串需要用双引号" "括起来 ;number数值类型,JSON中只有一个number类型,是没有int float double这些类型的 ;true/false布尔类型nullJSON中也定义了一个代表空的关键字 ;
可以看见 JSON 好多的格式,都不支持,比如 日期 类型,这也是 JSON 的一个缺点,下面介绍的 GSON 弥补了这一缺点 ;
构建 JSON 数据
使用
JSONObject对象构建JSON数据@Test
public void object2Json(){ // 定义一个 null 对象 ;
Object NULL = null ; // 利用 jsonObject 对象,构建 JSON
JSONObject jsonObject = new JSONObject() ;
jsonObject.put("name","yaz") ;
jsonObject.put("sex","男") ;
// 日期类型,用字符串,JSON 里面没有日期类型
jsonObject.put("birthday","1997-01-22") ;
// 插入数字的时候,java的数值类型,最后都会被转为 JSON 的number 类型
jsonObject.put("salary",5000.00) ;
jsonObject.put("age",22) ;
jsonObject.put("hasHouse",false) ;
// 直接传入 null ,编译不通过,因为 put 重载了 Collection 和 map 集合 ;
// 直接传入 null ,就不知道具体调用哪一个了
// 定义一个 null 对象,绕过编译 ;
// 值为 null 的属性,不会被传入到 JSON 中 ;
jsonObject.put("hasDream",NULL) ;
jsonObject.put("habit",new String[]{"LOL","打乒乓球","java-IT"}) ; System.out.println(jsonObject.toString());
}
生成的
JSON字符串 :{
"birthday": "1997-01-22",
"sex": "男",
"habit": [
"LOL",
"打乒乓球",
"java-IT"
],
"hasHouse": false,
"age": 22,
"name": "yaz",
"salary": 5000
}
使用
Map对象构建JSON数据@Test
public void map2Json(){
Map<String,Object> map = new HashMap<>();
map.put("name","yaz") ;
map.put("age",22) ;
map.put("birthday","97-01-22") ;
map.put("salary",5000.1) ;
map.put("habit",new String[]{"LOL","Music","sleep"}) ;
map.put("hasHouse",false) ;
map.put("car",null) ; // 还是需要 JSONObject ,将 map 传入
JSONObject jsonObject = new JSONObject(map) ; System.out.println(jsonObject);
}
生成的
JSON字符串 :{
"birthday": "97-01-22",
"habit": [
"LOL",
"Music",
"sleep"
],
"hasHouse": false,
"name": "yaz",
"age": 22,
"salary": 5000.1
}
使用
Javabean对象构建JSON数据 (推荐使用)@Test
public void Javabean2Json(){
Customer customer = new Customer() ;
customer.setAge(20);
customer.setBirtyday("97-02-28");
customer.setCarName(null);
customer.setHabit(new String[]{"lol","java-IT"});
customer.setSalary(5000.1);
customer.setHasHouse(false); JSONObject jsonObject = new JSONObject(customer);
System.out.println(jsonObject);
}
生成的
JSON字符串 :{
"birtyday": "97-02-28",
"habit": [
"lol",
"java-IT"
],
"hasHouse": false,
"age": 20,
"salary": 5000.1
}
总结:
- 生成
JSON串,都需要JSONObject对象 ,可以往里面一个一个属性的put,也可以直接传给它一个map,或者一个Javabean对象; - 属性为
null的属性,是不会为添加到JSON串中的 ;
解析 JSON 数据
从文件中读取
JSON解析数组
这里有个缺点:
JSON的工具类不能直接解析数组,需要使用JSONArray类辅助下 ;判断
null使用
jsonObject.isNull("键")判断对应的属性,是否存在 ; ;@Test
public void json2Object() throws IOException {
// 获取 json 串所在的文件
File file = new File(this.getClass().getClassLoader().getResource("jsonString.txt").getFile());
// 使用 Apache 的 fileUtils工具,读取文本文件内容,转成字符串
String json = FileUtils.readFileToString(file, "UTF-8");
// 还是使用 JSONObject 对象
JSONObject jsonObject = new JSONObject(json); // 读取 JSON 串的内容
// 判断 是否有 name 属性,如果没有,则不读取;
if (!jsonObject.isNull("name")) {
System.out.println("name" + jsonObject.getString("name"));
}
System.out.println("age" + jsonObject.getInt("age"));
System.out.println("salary" + jsonObject.getInt("salary"));
// 但是读取数组,需要使用另外一个对象
JSONArray jsonArray = jsonObject.getJSONArray("habit");
for (int i = 0; i < jsonArray.length(); i++) {
// 需要强转下
String habit = (String) jsonArray.get(i);
System.out.println("habit " + i + ":" + habit);
} }
这里有个坑:地址的写法,注意了,之前的写法,一直不好使,最后,直接建立一个资源文件,扔下面,然后访问到了
总结:解析 JSON 串的时候,需要我们自己一个一个的去获取属性,对于数组属性,还需要强转,因为它不知道里面的具体类型 ;
GSON
Google 的一个开源项目,对 JSON 进行了增强,比如支持了日期类型;
构建 GSON
@Test
public void object2Gson() throws ParseException {
CustomerWithDate customerWithDate = new CustomerWithDate();
customerWithDate.setAge(22);
customerWithDate.setName("yaz");
customerWithDate.setBirtyday(new SimpleDateFormat("yyyy-mm-dd").parse("1997-1-22"));
customerWithDate.setHabit(new String[]{"lol", "java"});
// 这个不会得到构建
customerWithDate.setPassword("sasas");
// 美化输出样式,使用 GsonBuilder
GsonBuilder gsonBuilder = new GsonBuilder();
// 进行个性化定制输出,也就是在构建的时候,对字段进行一些设定
gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy() {
@Override
public String translateName(Field field) {
if ("name".equals(field.getName())){
return "YAZZZZ" ;
}
return field.getName();
}
}) ;
gsonBuilder.setPrettyPrinting();
Gson gson = gsonBuilder.create();
System.out.println(gson.toJson(customerWithDate));
}
使用 Javabean 或者 map 对象 都可以,toJson 操作,参数是一个 object 类型 ;
解析 GSON
可以解析成自己的对象,而不是像 JSON 那样,解析成 JSONObject 对象 ;
@Test
public void gson2Object() throws IOException {
// 获取 json 串所在的文件
// 地址的写法,注意了,之前的写法,一直不好使,直接建立一个资源文件,扔下面,然后访问到了
File file = new File(this.getClass().getClassLoader().getResource("jsonString.txt").getFile());
// 使用 Apache 的 fileUtils工具,读取文本文件内容,转成字符串
String json = FileUtils.readFileToString(file, "UTF-8");
// 创建一个 支持解析日期 的 gson
Gson gson = new GsonBuilder().setDateFormat("yyyy-mm-dd").create() ;
CustomerWithDate customerWithDate = gson.fromJson(json,CustomerWithDate.class);
System.out.println(customerWithDate);
}
对比 JSON 的强大之处
支持改变生成
JSON的属性名(别名)/**
* 设置别名,使用注解
*/
@SerializedName("NAME")
private String name;
美化输出
// 美化输出样式,使用 GsonBuilder
GsonBuilder gsonBuilder = new GsonBuilder() ;
// 设置成漂亮的输出
gsonBuilder.setPrettyPrinting();
在解析的过程中,进行个性化定制
// 进行个性化定制输出,也就是在构建的时候,对字段进行一些设定
gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy() {
@Override
public String translateName(Field field) {
if ("name".equals(field.getName())){
return "YAZZZZ" ;
}
return field.getName();
}
}) ;
忽略掉某些
Javabean的属性// 使用关键字 transient 在构建 JSON 的时候,会忽略掉该属性
private transient String password;
支持解析日期
设定日期解析格式 ;
// 创建一个 支持解析日期 的 gson
Gson gson = new GsonBuilder().setDateFormat("yyyy-mm-dd").create() ;
支持
JSONArray数组到java集合类的无缝转换说的是,对于
JSON的Array数组,我们在 java 里面是可以直接用集合接收的,GSON会自动的转换 ;
JSON、GSON的更多相关文章
- Android JSON、GSON、FastJson的封装与解析
声明: 1.本帖只提供代码,不深入讲解原理.如果读者想要深入了解,那就不要在这个帖子上浪费时间了 2.客户端用的是Google官方的Volley访问服务器,具体了解Volley请戳 这里 3.本帖三种 ...
- 处理json的常用java类库:Json-lib(org.json)、Gson、Jackson、Fastjson
更多的处理json的java类库,有人做了性能对比,GitHub地址:https://github.com/fabienrenaud/java-json-benchmark 处理json的java类库 ...
- Android进阶笔记17:3种JSON解析工具(org.json、fastjson、gson)
一. 目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),其中解析速度最快的是Gson. 3种json工具下 ...
- FastJson、Jackson、Gson进行Java对象转换Json细节处理
前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...
- FastJson、Jackson、Gson进行Java对象转换Json的细节处理
前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...
- Android进阶笔记14:3种JSON解析工具(org.json、fastjson、gson)
一. 目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),其中解析速度最快的是Gson. 3种json工具下 ...
- 原生态的ajax 及json和gson学习资源
@RequestMapping(value = "/{id}/view") @jsobody public String viewProject( @PathVariable(&q ...
- Json与Gson讲解
1 json的含义: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言.易于 ...
- Java 常见数据交换格式——xml、json、yaml
目录 数据交换格式介绍 XML 使用DOM方式解析 使用SAX方式解析 使用DOM4J方式解析 使用JDOM方式解析 JSON 使用JSONObject方式将数据转换为JSON格式 利用JSONObj ...
随机推荐
- Matlab学习——求解微分方程(组)
介绍: 1.在 Matlab 中,用大写字母 D 表示导数,Dy 表示 y 关于自变量的一阶导数,D2y 表示 y 关于自变量的二阶导数,依此类推.函数 dsolve 用来解决常微分方程(组)的求解问 ...
- P2698 [USACO12MAR]花盆Flowerpot——单调队列
记录每天看(抄)题解的日常: https://www.luogu.org/problem/P2698 我们可以把坐标按照x递增的顺序排个序,这样我们就只剩下纵坐标了: 如果横坐标(l,r)区间,纵坐标 ...
- springBoot学习(一):初学Thymeleaf
这一部分的代码是基于大神的代码,只是原本的代码是有错的,只自己记录一下自己更改之后的代码和自己的理解. 使用Spring Initzal创建项目,最后代码结构如下,我对Spring及其相关之事还是全然 ...
- vue+elementui 开发的网站IE浏览器加载白屏(不兼容)解决办法
1.需要检查一下 export default { name: 'aa',-------vue的name是不可以重复的-----这个是决定性原因 data() { return {} } 2.变量声明 ...
- mysqlslap压力测试时出现"Can't connect to MySQL server"
mysqlslap -utest -h 192.168.1.12 -p'test' --concurrency=100 --iterations=500 --create-schema='my_db' ...
- postgresql数据的入门教程
postgreSQL数据库简介 PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行. PostgreSQL 开发者把它念作 post-gress-Q- ...
- (转)hadoop 配置文件解释
借鉴:https://blog.csdn.net/wangming520liwei/article/details/78923216 Hadoop 参数配置 详解 一.常用端口 组件 节点 默认端口 ...
- wx.navigateTo和wx.redirectTo的不同
wx.navigateTo保留当前页面,跳转到应用内的某个页面,使用wx.navigateBack可以返回到原页面. wx.redirectTo关闭当前页面,跳转到应用内的某个页面.就是不能返回了. ...
- 走进JavaWeb技术世界10:从JavaBean讲到Spring
Java 帝国之Java bean (上) 转自: 刘欣 码农翻身 2016-05-27 前言: 最近看到到spring 的bean 配置, 突然想到可能很多人不一定知道这个叫bean的东西的来龙去脉 ...
- 走进JavaWeb技术世界7:Tomcat中的设计模式
. 门面设计模式 门面设计模式在 Tomcat 中有多处使用,在 Request 和 Response 对象封装中.Standard Wrapper 到 ServletConfig 封装中.Appli ...