【JavaWeb】JSON 文件
JSON 文件
什么是 JSON
JSON(JavaScript Object Notation),即 JS 对象符号。 是一种轻量级(相对于 XML 来说)的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。JSON 采用完全独立于语言的文本格式,而且很多语言都提供了对 JSON 的支持,也有很多优秀的第三方库,这使得 JSON 成为理想的数据交换格式。其中数据交换指的是客户端和服务器之间的业务数据的传递格式。
JSON 在 JS 中的使用
JSON 的定义:
- 由键值对组成,并且由花括号包围
- 每个键由引号引起来
- 键和值之间使用冒号进行分隔,多组键值对之间进行逗号进行分隔
var jsonObj = {
"key1": 12,
"key2": "abc",
"key3": true,
"key4": [11, "arr", false],
"key5": {
"key5_1": 551,
"key5_2": "key5_2_value"
},
"key6":[{
"key6_1_1": 6611,
"key6_1_2": "key6_1_2_value"
}, {
"key6_2_1": 6621,
"key6_2_2": "key6_2_2_value"
}]
};
JSON 的访问:
- 它本身是一个对象,其中的 key 可以理解为是对象中的一个属性
- key 访问就跟访问对象的属性一样:
JSON 对象.key
alert(typeof(jsonObj));// object, 说明 json 就是一个对象
alert(jsonObj.key1); // 12
alert(jsonObj.key2); // abc
alert(jsonObj.key3); // true
alert(jsonObj.key4);// 得到数组[11,"arr",false]
// json 中 数组值的遍历
for(var i = 0; i < jsonObj.key4.length; i++) {
alert(jsonObj.key4[i]);
}
alert(jsonObj.key5.key5_1);//551
alert(jsonObj.key5.key5_2);//key5_2_value
alert(jsonObj.key6 );// 得到 json 数组
// 取出来每一个元素都是 json 对象
var jsonItem = jsonObj.key6[0];
// alert( jsonItem.key6_1_1 ); //6611
alert( jsonItem.key6_1_2 ); //key6_1_2_value
JSON 的常用方法:
- JSON 的存在形式:
- 对象的形式存在,称作 JSON 对象,操作 JSON 中的数据时需要这种形式
- 字符串的形式存在,称作 JSON 字符串,在客户端和服务器之间进行数据交换时需要这种形式
- JSON.stringfy() 把 JSON 对象 转换为 JSON 字符串
- JSON.parse() 把 JSON 字符串 转换为 JSON 对象
// 把 json 对象转换成为 json 字符串
var jsonObjString = JSON.stringify(jsonObj); // 特别像 Java 中对象的 toString
alert(jsonObjString)
// 把 json 字符串转换成为 json 对象
var jsonObj2 = JSON.parse(jsonObjString);
alert(jsonObj2.key1);// 12
alert(jsonObj2.key2);// abc
JSON 在 Java 中的使用
这里以 gson 为例。
JavaBean 和 JSON 的互转
package cn.parzulpan.test;
import cn.parzulpan.bean.User;
import com.google.gson.Gson;
/**
* @Author : parzulpan
* @Time : 2020-12-14
* @Desc : JavaBean 和 JSON 的互转
*/
public class JavaBeanAndJSON {
public static void main(String[] args) {
// 创建 JavaBean 对象
User user = new User(1, "parzulpan", "123456", "parzulpan@321.com");
// 创建 Gson 对象
Gson gson = new Gson();
// toJson 方法可以把 java 对象转换成为 json 字符串
String userJsonString = gson.toJson(user);
System.out.println(userJsonString);
// fromJson 把 json 字符串转换回 Java 对象
// 第一个参数是 json 字符串
// 第二个参数是转换回去的 Java 对象类型,对于 JavaBean 可以直接 .class
User user1 = gson.fromJson(userJsonString, User.class);
System.out.println(user1);
}
}
List 和 JSON 的互转
package cn.parzulpan.test;
import cn.parzulpan.bean.User;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;
/**
* @Author : parzulpan
* @Time : 2020-12-14
* @Desc : List 和 JSON 的互转
*/
public class ListAndJSON {
public static void main(String[] args) {
ArrayList<User> userList = new ArrayList<>();
userList.add(new User(1, "parzulpan", "123456", "parzulpan@321.com"));
userList.add(new User(null, "tom", "214531", "tom@321.com"));
Gson gson = new Gson();
// 把 List 转换为 JSON 字符串
String userListJsonString = gson.toJson(userList);
System.out.println(userListJsonString);
// 把 JSON 字符串 转换为 List,对于集合,第二个参数需要 Type typeOfT
// 为了确保范型,需要实现一个类继承 TypeToken
System.out.println(new UserListType().getType()); // class java.util.ArrayList
System.out.println(new UserListType().getRawType()); // class cn.parzulpan.test.UserListType
ArrayList<User> list = gson.fromJson(userListJsonString, new UserListType().getType());
System.out.println(list);
User user = list.get(0);
System.out.println(user);
}
}
class UserListType extends TypeToken<ArrayList<User>> {
}
Map 和 JSON 的互转
package cn.parzulpan.test;
import cn.parzulpan.bean.User;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @Author : parzulpan
* @Time : 2020-12-14
* @Desc : Map 和 JSON 的互转
*/
public class MapAndJSON {
public static void main(String[] args) {
Map<Integer, User> userMap = new LinkedHashMap<>();
userMap.put(1, new User(1, "parzulpan", "123456", "parzulpan@321.com"));
userMap.put(2, new User(null, "tom", "214531", "tom@321.com"));
Gson gson = new Gson();
String userMapJsonString = gson.toJson(userMap);
System.out.println(userMapJsonString);
// Map<Integer, User> userMap1 = gson.fromJson(userMapJsonString, new UserMapType().getType());
// 或者用匿名类,推荐这种做法
Map<Integer, User> userMap1 = gson.fromJson(userMapJsonString, new TypeToken<LinkedHashMap<Integer, User>>() {
}.getType());
System.out.println(userMap1);
User user = userMap1.get(1);
System.out.println(user);
}
}
class UserMapType extends TypeToken<LinkedHashMap<Integer, User>> {
}
开源类库
gson
Gson 是目前功能最全的 Json 解析神器,Gson 当初是为 Google 公司内部需求而由 Google 自行研发而来,但自从在 2008 年五月公开发布第一版后已被许多公司或用户应用。
Gson 的应用主要为 toJson 与 fromJson 两个转换函数,无依赖,不需要例外额外的 jar,能够直接跑在 JDK 上。
在使用这种对象转换之前,需先创建好对象的类型以及其成员才能成功的将 JSON 字符串成功转换成相对应的对象。类里面只要有 get 和 set 方法,Gson 完全可以实现复杂类型的 json 和 bean 的相互转换转换。
public class GsonUtil {
private static Gson gson = new GsonBuilder().create();
public static String bean2Json(Object obj) {
return gson.toJson(obj);
}
public static <T> T json2Bean(String jsonStr, Class<T> objClass) {
return gson.fromJson(jsonStr, objClass);
}
public static String jsonFormatter(String uglyJsonStr) {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonParser jp = new JsonParser();
JsonElement je = jp.parse(uglyJsonStr);
return gson.toJson(je);
}
}
fastjson
Fastjson 是一个 Java 语言编写的高性能的 JSON 处理器,由阿里巴巴公司开发。无依赖,不需要例外额外的 jar,能够直接跑在JDK上。
FastJson 在复杂类型的 Bean 转换 Json 上会出现一些问题,可能会出现引用的类型,导致 Json 转换出错,需要制定引用。FastJson 采用独创的算法,将 parse 的速度提升到极致,超过所有 json 库。
public class FastJsonUtil {
public static String bean2Json(Object obj) {
return JSON.toJSONString(obj);
}
public static <T> T json2Bean(String jsonStr, Class<T> objClass) {
return JSON.parseObject(jsonStr, objClass);
}
}
jackson
Jackson 社区相对比较活跃,更新速度也比较快,从 Github 中的统计来看,Jackson 是最流行的 json 解析器之一,Spring MVC 的默认 json 解析器便是 Jackson。
Jackson 的核心模块由三部分组成:
- jackson-core 核心包,提供基于”流模式”解析的相关 API,它包括 JsonPaser 和 JsonGenerator。Jackson 内部实现正是通过高性能的流模式 API 的 JsonGenerator 和 JsonParser 来生成和解析 json
- jackson-annotations 注解包,提供标准注解功能
- jackson-databind 数据绑定包,提供基于”对象绑定” 解析的相关 API( ObjectMapper )和”树模型” 解析的相关 API(JsonNode);基于”对象绑定” 解析的 API 和”树模型”解析的 API 依赖基于”流模式”解析的 API
public class JacksonUtil {
private static ObjectMapper mapper = new ObjectMapper();
public static String bean2Json(Object obj) {
try {
return mapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
e.printStackTrace();
return null;
}
}
public static <T> T json2Bean(String jsonStr, Class<T> objClass) {
try {
return mapper.readValue(jsonStr, objClass);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
练习和总结
【JavaWeb】JSON 文件的更多相关文章
- ASP.NET Core 在 JSON 文件中配置依赖注入
前言 在上一篇文章中写了如何在MVC中配置全局路由前缀,今天给大家介绍一下如何在在 json 文件中配置依赖注入. 在以前的 ASP.NET 4+ (MVC,Web Api,Owin,SingalR等 ...
- ios项目里扒出来的json文件
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #000000 } p.p2 { margin: 0.0px 0. ...
- C#解析json文件的方法
C# 解析 json JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集. JSON采用完全独立于语言的 ...
- Json.NET读取和写入Json文件
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- 纯前端JSON文件编辑器[0]
准备工作 参考资料: FileReader(用来获取上传文件的数据) <download>(用来设置下载文件的名称) Blob(用来存储数据的一个容器) createObjectURL(用 ...
- gulp-rev同时将js和css文件写在一个rev-manifest.json文件里面的方式探讨
参考: https://segmentfault.com/q/1010000002876613 https://github.com/sindresorhus/gulp-rev 测试发现,在官网上最主 ...
- Elasticsearch集群状态脚本及grafana监控面板导出的json文件
脚本文件: #!/usr/bin/env python import datetime import time import urllib import json import urllib2 imp ...
- grafana日志分析界面及导出的json文件
日志分析面板导出的json文件,效果图如下: 下载地址:http://files.cnblogs.com/files/xiaoming279/%E9%9D%A2%E6%9D%BF.zip 主机面板 主 ...
- 访问本地json文件因跨域导致的问题
我使用jquery的getJSON的方法获取本地的json文件,并进行操作,获取json 数据代码如下: $.getJSON("invite_panel.json",functio ...
随机推荐
- python 数据分析与挖掘实战01
python 数据分析与挖掘实战 day 01 08/02 这种从数据中"淘金",从大量数据包括文本中挖掘出隐含的.未知的.对决策有潜在价值关系.模式或者趋势,并用这些知识和规则建 ...
- git 远端版本回退
情景:本地更改推送远端后,想要回退到自己推送之前的某个版本. 比如想回退的分支为 test 分支. 风险:远端回退到某一版本后,之后的所有推送都没了(对应的日志记录也没了).如果是团队开发,不仅自己推 ...
- Linux相关知识基础
目录 前言 第一章 Linux远程连接管理 1. 为什么要远程连接Linux系统 2. 连接前的小知识 2.2.1 IP地址 2.2.2 端口的概念 2.2.3 协议的概念 3. 远程连接Linux的 ...
- centos7下安装iostat命令
[root@node01 yum.repos.d]# yum intall -y sysstat Loaded plugins: fastestmirror No such command: inta ...
- 使用vika维格表来管理寺庙原来如此轻松~
我有一款适合用于寺庙管理的软件推荐,它是vika维格表,一款一站式的项目管理工具. 一站式项目管理 一个小小的寺庙需要管理的内容也非常的多,你应该不会购买多个系统去管理不同的项目,这样会让寺庙的花费大 ...
- sqli-labs 20-22 --cookie注入
异常处理 一开始打开这个题目的时候找不到cookie... 登录成功就是没有cookie cookie注入没有cookie... 第二天重新做的时候,同学讲自己设置cookie可以用 用插件EditT ...
- 【Azure App Service】C#下制作的网站,所有网页本地测试运行无误,发布至Azure之后,包含CHART(图表)的网页打开报错,错误消息为 Runtime Error: Server Error in '/' Application
问题描述 C#下制作的网站,所有网页本地测试运行无误,发布至Azure之后,包含CHART(图表)的网页打开报错,错误消息为 Runtime Error: Server Error in '/' Ap ...
- Cannot assign requested address 和 SO_REUSEADDR 参数
1. 错误 今天项目中出现了大量的java.net.ConnectException: Cannot assign requested address (connect failed) 错误. 刚开始 ...
- eclipse在线安装svn插件subclipse
eclipse在线安装svn插件subclipse 1 Help > Eclipse Marketplace,打开Eclipse Marketplace 2 切换到Search,输入subcli ...
- Java学习日报7.20
//7.20 三个和尚比身高import java.util.Scanner; //导包public class Hello{ public static void main(String[] arg ...