JSON详解
JSON对象
JSON:JavaScript对象表示法(JavaScript Object Notation)跨语言使用
json 基本类型 {“key”:value, “key”:value……}
数组类型 {[{“key”:value },{ key”:value }……]} 在打印中大括号没显示
基本类型与数组类型能够相互嵌套
{ "name": "teacher", "computer": { "CPU": "intel7", "disk": "512G" }, "students": [ { "name": "张三", "age": 18, "sex": true }, { "name": "李四", "age": 19, "sex": false } ] } |
注意: 存储结构是KEY-VALUE
key为string类型
value为:String Boolean Number 数组 Object null
Json 串以{开始,以}结尾;
Json 串中数组是以[开始,以]结尾;
Json 串中 Object 是以{开始,以}结尾
由于json中存在双引号,手动拼接json对象需要\对引号进行转义
gson解析处理
google提供的类库,将JSON字符串与java对象转换
将架包设置在web项目的 web-inf\lib\目录下
将java对象转为Json字符串
首先获取对象,再将对象转为字符串
对象也可以是数组和容器对象
String json引用=new Gson().toJson(对象);
或者预先对转换器进行声明
Gson gson=new Gson();
String json引用=gson.toJson(对象);
User user = new User(1,"zhangsan","123123"); String json = new Gson().toJson(user); System.out.println(json); |
将Json字符串转为java对象
直接转换
先创建转换器
Gson gson = new Gson();
根据数组还是对象执行不同的参数
1 Json字符串为单一javabean对象
类名 对象引用=gson.fromJson(jsonstr, 对象引用.class)
Gson gson = new Gson(); User user = gson.fromJson(json, User.class); //采用user接收json字符串的,参数为用来接收的反射类 |
(注意,接收对象的javabean需要空构造)
2 Json字符串为一维数组 数组内无多层嵌套
容器<范型> 引用=
gson.fromJson(jsonstr,new TypeToken<容器<范型>>(){}.getType());
String json2 = "[\"aaa\",\"bbb\",\"bbb\"]"; Gson gson = new Gson(); List<String> list = gson.fromJson(json2, new TypeToken<List<String>>(){}.getType()); //通过list容器存储 |
若Json字符串为多个对象的数组,将范型改为对应的对象类
String json3 = "[{\"userId\":1,\"userName\":\"zhangsan\",\"userPwd\":\"123123\"},{\"userId\":2,\"userName\":\"lisi\",\"userPwd\":\"111111\"},{\"userId\":3,\"userName\":\"wangwu\",\"userPwd\":\"234567\"}]"; Gson gson = new Gson(); List<User> userList = gson.fromJson(json3, new TypeToken<List<User>>(){}.getType()); |
若存在多层嵌套可以在接收对象中存在参数为容器,才能存储
节点解析
1获取解析器
JsonParser parser = new JsonParser();
2将json字符串转为JsonElement对象
JsonElement element= parser.prese(jsonstr);
3获取节点,解析节点
获取根节点;再在根节点的基础上获取各个节点;若节点为可取值节点则进行取值
根节点的获取
JsonObject root = element.getAsJsonObject();根节点为对象
根节点若为数组的情况通过Array进行接收
下级节点的获取
JsonObject 子节点= 父节点.getAsJsonObject(“key”);
JsonPrimitive 子节点= 父节点.getAsJsonPrimitive(“key”);
JsonArray 子节点=父节点.getAsJsonArray(“key”);
节点的取值
JsonPrimitive类型
String name = primitive2.getAsString();
boolean flag = primitive.getAsBoolean();
通过各数据类型的getAs数据类型()方法获取值
JsonObject 类型
通过javabean接收
User user = new Gson().fromJson(userObject, User.class);
JsonArray类型
通过容器接收.同上
节点概念
Gson的节点对象:
JsonElement 所有的节点都是JsonElement 对象
JsonPrimitive 基本的数据类型的节点对象
JsonNull 代表空节点对象,即 有 key,value 为空
JsonObject 对象数据类型的节点对象
JsonArray 数组数据类型的节点对象
JsonElement的取值:
1 JsonPrimitive value的取值对应 java 的
int,double,float,long,short,boolean,char,byte,String,
BigDecimal,BigI nteger,Number
2 JsonObject value 的取值对应 java 的 Object 对象.
3 JsonArray value 的取值对应 java 的 List 及其子类对象.
注:数组节点也能通过增强for遍历进行处理
for (JsonElement user : jsonArray) { UserBean userBean = new Gson().fromJson(user, new TypeToken<UserBean>() {}.getType());} |
FastJson解析处理
对象转字符串
对象转json通过静态方法实现
JSON.toJSONString(对象) 使用所有对象
json字符串转对象
对象 通过JSON.parseObject()方法
UserBean user=JSON.parseObject(jsonstr, UserBean.class )
容器(数组) 通过JSON.parseArray ()方法
List<String> list = JSON.parseArray(json2, String.class);
List<User> userList = JSON.parseArray(json3, User.class);
均为静态方法