前言 最近在开发过程中使用了大量的json
作为前后端数据交换的方式,由于之前没有对json
做过系统的学习,所有在使用过程中查阅了大量的文档与资料,这里主要记录了我在开发后对json
以及FastJson
使用的总结
Json介绍 JSON
(javaScript Object Notation)是一种轻量级的数据交换格式。主要采用键值对({"name": "json"}
)的方式来保存和表示数据。JSON
是JS
对象的字符串表示法,它使用文本表示一个JS
对象的信息,本质上是一个字符串。更多简介见介绍JSON 。
FastJson 简介 在日志解析,前后端数据传输交互中,经常会遇到字符串(String)与json
,XML
等格式相互转换与解析,其中json
以跨语言,跨前后端的优点在开发中被频繁使用,基本上可以说是标准的数据交换格式。fastjson 是一个java语言编写的高性能且功能完善的JSON库,它采用一种“假定有序快速匹配”的算法,把JSON Parse
的性能提升到了极致。它的接口简单易用,已经被广泛使用在缓存序列化,协议交互,Web输出等各种应用场景中。
FastJson 常用 API 导入Jar包
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency>
FastJson API 入口类是com.alibaba.FastJson.JSON
,常用的序列化操作都可以在JSON
类上的静态方法直接完成。
public static final Object parse (String text) ; public static final JSONObject parseObject (String text) ; public static final <T> T parseObject (String text, Class<T> clazz) ; public static final JSONArray parseArray (String text) ; public static final <T> List<T> parseArray (String text, Class<T> clazz) ; public static final String toJSONString (Object object) ; public static final String toJSONString (Object object, boolean prettyFormat) ; public static final Object toJSON (Object javaObject) ;
使用方法举例 import com.alibaba.FastJson.JSON;Model model = JSON.parseObject(jsonStr, Model.class ) ;
有关类库的一些说明
JSONArray : 相当于List
JSONObject: 相当于Map<String,Object>
FastJson 使用实例 Java对象与Json字符串的互转 User
测试类
package com.tunan.json.user;public class User { private String username; private String password; public User () { } public User (String username, String password) { this .username = username; this .password = password; } public String getUsername () { return username; } public void setUsername (String username) { this .username = username; } public String getPassword () { return password; } public void setPassword (String password) { this .password = password; } }
UserGroup
测试类
package com.tunan.json.user;import java.util.ArrayList;import java.util.List;public class UserGroup { private String name; private List<User> users= new ArrayList<User>(); public UserGroup () { } public UserGroup (String name, List<User> users) { this .name = name; this .users = users; } public String getName () { return name; } public void setName (String name) { this .name = name; } public List<User> getUsers () { return users; } public void setUsers (List<User> users) { this .users = users; } }
fastJson
测试类
package com.tunan.json.user;import com.alibaba.fastjson.JSON;import java.util.ArrayList;import java.util.List;public class TestFastJosn { public static void main (String[] args) { objectToJson(); JsonToObject(); } static public void objectToJson () { User user = new User("tunan" ,"123456" ); String userJson = JSON.toJSONString(user); System.out.println("简单java类转字符串: " +userJson); User user1 = new User("xiaoqi" , "961228" ); User user2 = new User("tunan" , "123456" ); List<User> users = new ArrayList<User>(); users.add(user1); users.add(user2); String listJson = JSON.toJSONString(users); System.out.println("List<Object>转Json字符串: " +listJson); UserGroup userGroup = new UserGroup("student" , users); String userGroupJson = JSON.toJSONString(userGroup); System.out.println("复杂java转json字符串: " +userGroupJson); } static public void JsonToObject () { String userJson = "{'password':'123456','username':'dmego'}" ; User user = JSON.parseObject(userJson, User.class ) ; System.out.println("json字符串转简单java对象: " +user.toString()); String listUserJson = "[{'password':'123123','username':'zhangsan'},{'password':'321321','username':'lisi'}]" ; List<User> userList = JSON.parseArray(listUserJson, User.class ) ; System.out.println("json字符串转List<Object>对象: " +userList.toString()); String userGroupJson = "{'name':'userGroup','users':[{'password':'123123','username':'zhangsan'},{'password':'321321','username':'lisi'}]}" ; UserGroup userGroup = JSON.parseObject(userGroupJson, UserGroup.class ) ; System.out.println("json字符串转复杂java对象: " +userGroup.toString()); } }
结果
简单java类转字符串: {"password" :"123456" ,"username" :"tunan" } List<Object>转Json字符串: [{"password" :"961228" ,"username" :"xiaoqi" },{"password" :"123456" ,"username" :"tunan" }] 复杂java转json字符串: {"name" :"student" ,"users" :[{"password" :"961228" ,"username" :"xiaoqi" },{"password" :"123456" ,"username" :"tunan" }]} json字符串转简单java对象: User{username='dmego' , password='123456' } json字符串转List<Object>对象: [User{username='zhangsan' , password='123123' }, User{username='lisi' , password='321321' }] json字符串转复杂java对象: UserGroup{name='userGroup' , users=[User{username='zhangsan' , password='123123' }, User{username='lisi' , password='321321' }]}
通过结果看代码:
我们可以看到,在JavaBean
转Json
的时候,使用了JSON.toJSONString()
方法
该方法中传入的是对象,即生成对象的Json
字符串
如果传入的是List
,生成的就是对象的Json
字符串数组
如果传入的是复杂类型既有对象,又有对象数组,那么生成的就是个Json
对象,这个对象中包括对象的Json
字符串和对象的Json
字符串数组,Json
的字符串数组中又包含对象的Json
字符串。
在Json
转JavaBean
的时候,会根据调用JSON.parseObject()
和JSON.parseArray()
的不同,输出不同的结果
传入对象的Json
字符串和需要生成的Java
对象,需要调用JSON.parseObject()
方法,输出的就是一个普通的对象
传入对象的Json
字符串数组和要生成的Java
对象,需要调用JSON.parseArray()
方法,输出是一个Java
对象数组
传入的即包含对象的Json
字符串,又包含对象的Json
字符串数组,那么需要调用一个JSON.parseObject()
方法,该方法会输出一个复杂的Java对象,该对象既包括对象又包括对象数组。
FastJson解析复杂嵌套Json字符串 这个实例是我在开发中用到的,先给出要解析的Json字符串
[ { "id" : "user_list" , "key" : "id" , "tableName" : "用户列表" , "className" : "cn.dmego.domain.User" , "column" : [ { "key" : "rowIndex" , "header" : "序号" , "width" : "50" , "allowSort" : "false" }, { "key" : "id" , "header" : "id" , "hidden" : "true" }, { "key" : "name" , "header" : "姓名" , "width" : "100" , "allowSort" : "true" } ] }, { "id" : "role_list" , "key" : "id" , "tableName" : "角色列表" , "className" : "cn.dmego.domain.Role" , "column" : [ { "key" : "rowIndex" , "header" : "序号" , "width" : "50" , "allowSort" : "false" }, { "key" : "id" , "header" : "id" , "hidden" : "true" }, { "key" : "name" , "header" : "名称" , "width" : "100" , "allowSort" : "true" } ] } ]
要想解析这种复杂的字符串,首先得先定义好与之相符的Java POJO 对象,经过观察,我们发现,这个是一个Json对象数组,每一个对象里包含了许多属性,其中还有一个属性的类型也是对象数组。所有,我们从里到外,先定义最里面的对象:
public class Column { private String key; private String header; private String width; private String allowSort; private String hidden; @Override public String toString () { return "Column{" + "key='" + key + '\'' + ", header='" + header + '\'' + ", width='" + width + '\'' + ", allowSort='" + allowSort + '\'' + ", hidden='" + hidden + '\'' + '}' ; } }
再定义外层的对象:
public class Query { private String id; private String key; private String tableName; private String className; private List<Column> column; @Override public String toString () { return "Query{" + "id='" + id + '\'' + ", key='" + key + '\'' + ", tableName='" + tableName + '\'' + ", className='" + className + '\'' + ", column=" + column + '}' ; } }
我的这个Json文件放置在类路径下,最后想将这个Json字符串转化为List对象,并且将column 对象数组转化为query对象里的List属性
public class RoleTest { public static void main (String[] args) throws IOException { RoleTest roleTest = new RoleTest(); List<Query> queries = roleTest.JsonToObject(); queries.forEach(System.out::println); } public List<Query> JsonToObject () throws IOException { ClassLoader loader = this .getClass().getClassLoader(); InputStream in = loader.getResourceAsStream("query.json" ); String jsonTxet = IOUtils.toString(in, "utf8" ); List<Query> query = JSON.parseArray(jsonTxet, Query.class ) ; return query; } }
结果
Query{id='user_list' , key='id' , tableName='用户列表' , className='cn.dmego.domain.User' , column=[Column{key='rowIndex' , header='序号' , width='50' , allowSort='false' , hidden='null' }, Column{key='id' , header='id' , width='null' , allowSort='null' , hidden='true' }, Column{key='name' , header='姓名' , width='100' , allowSort='true' , hidden='null' }]} Query{id='role_list' , key='id' , tableName='角色列表' , className='cn.dmego.domain.Role' , column=[Column{key='rowIndex' , header='序号' , width='50' , allowSort='false' , hidden='null' }, Column{key='id' , header='id' , width='null' , allowSort='null' , hidden='true' }, Column{key='name' , header='名称' , width='100' , allowSort='true' , hidden='null' }]}