FastJson使用

JSON介绍:

JSON(javaScript Object Notation)是一种轻量级的数据交换格式。主要采用键值对({"name": "json"})的方式来保存和表示数据。JSON是JS对象的字符串表示法,它使用文本表示一个JS对象的信息,本质上是一个字符串


fastjson介绍:

在日志解析,前后端数据传输交互中,经常会遇到字符串(String)与json,XML等格式相互转换与解析,其中json以跨语言,跨前后端的优点在开发中被频繁使用,基本上可以说是标准的数据交换格式。fastjson是一个java语言编写的高性能且功能完善的JSON库,它采用一种“假定有序快速匹配”的算法,把JSON Parse 的性能提升到了极致。它的接口简单易用,已经被广泛使用在缓存序列化,协议交互,Web输出等各种应用场景中。

fastjson 常用 API:

fastjson API 入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。

public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray 
public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject    
public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse为JavaBean 
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray 
public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合 
public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本 
public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本 
public static final Object toJSON(Object javaObject); //将JavaBean转换为JSONObject或者JSONArray。

 

一:基础使用方法

依赖:

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.28</version>
        </dependency>

1:将对象转换成Json串,可以用下面的方法:

JSON.toJSONString(对象);

2:将Json串转换成java对象,分为两种情况:

//对象是单个元素
JSON.parseObject(json串,CLAZZ);
//对象包含多个元素
JSON.parseArray(json串,CLAZZ);
  • JSONArray : 相当于List
  • JSONObject: 相当于Map<String,Object>

互转换实例:

List <---->Json

List<String> stringList = new ArrayList<>();
stringList.add("aaa");
stringList.add("bbb");
stringList.add("ccc");
stringList.add("ddd");
//list-->json
String jsonString = JSON.toJSONString(stringList);
//json-->list
List<String> list =JSON.parseArray(jsonString,String.class);

Map <---->Json

Map<String,Integer> map = new HashMap<>();
map.put("zhangsan", 18);
map.put("lisi", 28);
map.put("wangwu", 38);
//map-->json
String jsonString2 = JSON.toJSONString(map);
//json-->map
Map<String,Integer> map2 =JSON.parseObject(jsonString2,Map.class);

JavaBean <------> Json

User.java

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User {
    private String username;
    private String password;

    @Override
    public String toString(){
        return "User [username=" + username + ", password=" + password + "]";
    }
}

UserGroup.java

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserGroup {
    private String name;
    List<User> userList = new ArrayList<>();

    @Override
    public String toString(){
        return "UserGroup [name=" + name + ", userList=" + userList + "]";
    }
}

测试类1:

import com.alibaba.fastjson.JSON;
import java.util.List;

public class FastJsonTest {
    public static void main(String[] args) {
        //构建用户geust
        User guestUser = new User("guest", "18");
        //构建用户root
        User rootUser = new User("root", "28");
        //构建用户组
        UserGroup group = new UserGroup();
        group.setName("admin");
        group.getUserList().add(guestUser);
        group.getUserList().add(rootUser);
        //用户组对象构建JSON串串
        String jsonString = JSON.toJSONString(group);
        System.out.println(jsonString);

        //构建用户对象组
        User[] users = new User[2];
        users[0] = guestUser;
        users[1] = rootUser;
        //用户对象数组转JSON串
        String jsonString2 = JSON.toJSONString(users);
        System.out.println(jsonString2);

        //JSON串转化用户对象列表
        List<User> users1 = JSON.parseArray(jsonString2, User.class);
        System.out.println(users1);
    }
}

测试2:java对象转 json字符串

    /**
     * java对象转 json字符串
     */
    @Test
    public void objectTOJson(){
        //简单java类转json字符串
        User user = new User("dmego", "123456");
        String UserJson = JSON.toJSONString(user);
        System.out.println("简单java类转json字符串:"+UserJson);

        //List<Object>转json字符串
        User user1 = new User("zhangsan", "123123");
        User user2 = new User("lisi", "321321");
        List<User> users = new ArrayList<User>();
        users.add(user1);
        users.add(user2);
        String ListUserJson = JSON.toJSONString(users);
        System.out.println("List<Object>转json字符串:"+ListUserJson);

        //复杂java类转json字符串
        UserGroup userGroup = new UserGroup("userGroup", users);
        String userGroupJson = JSON.toJSONString(userGroup);
        System.out.println("复杂java类转json字符串:"+userGroupJson);
    }

测试3:json字符串转java对象   注:字符串中使用双引号需要转义 (" --> \"),这里使用的是单引号

    public void JsonTOObject(){
        /* json字符串转简单java对象
         * 字符串:{"password":"123456","username":"dmego"}*/

        String jsonStr1 = "{'password':'123456','username':'dmego'}";
        User user = JSON.parseObject(jsonStr1, User.class);
        user.setPassword("3333");
        System.out.println("json字符串转简单java对象:"+user.toString());

        /*
         * json字符串转List<Object>对象
         * 字符串:[{"password":"123123","username":"zhangsan"},{"password":"321321","username":"lisi"}]
         */
        String jsonStr2 = "[{'password':'123123','username':'zhangsan'},{'password':'321321','username':'lisi'}]";
        List<User> users = JSON.parseArray(jsonStr2, User.class);
        System.out.println("json字符串转List<Object>对象:"+users.toString());

        /*json字符串转复杂java对象
         * 字符串:{"name":"userGroup","users":[{"password":"123123","username":"zhangsan"},{"password":"321321","username":"lisi"}]}
         * */
        String jsonStr3 = "{'name':'userGroup','users':[{'password':'123123','username':'zhangsan'},{'password':'321321','username':'lisi'}]}";
        UserGroup userGroup = JSON.parseObject(jsonStr3, UserGroup.class);
        System.out.println("json字符串转复杂java对象:"+userGroup);
    }
}

二:复杂的用法(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;
	
	public String getKey() {
		return key;
	}
	public void setKey(String key) {
		this.key = key;
	}
    //这里省略部分getter与setter方法	
}

再定义外层的对象:

import java.util.List;
import org.apache.commons.collections4.map.LinkedMap;

public class Query {
	private String id;
	private String key;
	private String tableName;
	private String className;
    private List<LinkedMap<String, Object>> column; 
    private List<Column> columnList;
    
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
    //这里省略部分getter与setter方法	
	public List<LinkedMap<String, Object>> getColumn() {
		return column;
	}
	public void setColumn(List<LinkedMap<String, Object>> column) {
		this.column = column;
	}
	public List<Column> getColumnList() {
		return columnList;
	}
	public void setColumnList(List<Column> columnList) {
		this.columnList = columnList;
	}
}

我的这个json文件放置在类路径下,最后想将这个json字符串转化为List对象,并且将column 对象数组转化为query对象里的List属性
而实际转化过程中,fastjson将column对象数组转化为List;所有我们还需要将Map类型转化为object类型才能满足需求。

    /**
	 * 读取类路径下的配置文件
	 * 解析成对象数组并返回
	 * @throws IOException
	 */
	@Test
	public List<Query> test() throws IOException {
		// 读取类路径下的query.json文件
		ClassLoader cl = this.getClass().getClassLoader();
		InputStream inputStream = cl.getResourceAsStream("query.json");
		String jsontext = IOUtils.toString(inputStream, "utf8");
		// 先将字符jie串转为List数组
		List<Query> queryList = JSON.parseArray(jsontext, Query.class);
		for (Query query : queryList) {
			List<Column> columnList = new ArrayList<Column>();
			List<LinkedMap<String,Object>> columns = query.getColumn();
			for (LinkedMap<String, Object> linkedMap : columns) {
				//将map转化为java实体类
				Column column = (Column)map2Object(linkedMap, Column.class);
				System.out.println(column.toString());
				columnList.add(column);
			}
			query.setColumnList(columnList); //为columnList属性赋值
		}
        return queryList;
	}

    /**
     * Map转成实体对象
     * @param map map实体对象包含属性
     * @param clazz 实体对象类型
     * @return
     */
    public static Object map2Object(Map<String, Object> map, Class<?> clazz) {
        if (map == null) {
            return null;
        }
        Object obj = null;
        try {
            obj = clazz.newInstance();
            Field[] fields = obj.getClass().getDeclaredFields();
            for (Field field : fields) {
                int mod = field.getModifiers();
                if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
                    continue;
                }
                field.setAccessible(true);
                String flag = (String) map.get(field.getName());
                if(flag != null){
                	if(flag.equals("false") || flag.equals("true")){
                    	field.set(obj, Boolean.parseBoolean(flag));
                    }else{
                    	field.set(obj, map.get(field.getName()));
                    }
                }                
            }
        } catch (Exception e) {
            e.printStackTrace();
        } 
        return obj;
    }

三:自定义转化

将Java对象转化json格式

import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;

@Data
@NoArgsConstructor
public class Person {

    @JSONField(name = "AGE")
    private int age;

    @JSONField(name = "FULL NAME")
    private String fullName;

    @JSONField(name = "DATE OF BIRTH")
    private Date dateOfBirth;
    public Person(int age, String fullName, Date dateOfBirth) {
        super();
        this.age = age;
        this.fullName= fullName;
        this.dateOfBirth = dateOfBirth;
    }
}

使用 JSON.toJSONString() 将 Java 对象转换换为 JSON 对象:

import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class JavaToJson {
    public static void main(String[] args) {
        List<Person> listOfPersons = new ArrayList<Person>();
        listOfPersons.add(new Person(15, "John Doe", new Date()));
        listOfPersons.add(new Person(20, "Janette Doe", new Date()));
        String jsonOutput= JSON.toJSONString(listOfPersons);
        System.out.println(jsonOutput);
    }

输出结果:

[  
    {  
        "AGE":15,
        "DATE OF BIRTH":1468962431394,
        "FULL NAME":"John Doe"
    },
    {  
        "AGE":20,
        "DATE OF BIRTH":1468962431394,
        "FULL NAME":"Janette Doe"
    }
]

自定义输出,并控制字段的排序,日期显示格式,序列化标记等

更新 bean 并添加几个字段:

@JSONField(name="AGE", serialize=false)
private int age;
 
@JSONField(name="LAST NAME", ordinal = 2)
private String lastName;
 
@JSONField(name="FIRST NAME", ordinal = 1)
private String firstName;
 
@JSONField(name="DATE OF BIRTH", format="dd/MM/yyyy", ordinal = 3)
private Date dateOfBirth;

以上代码中我们列出了基本参数类别,并使用 @JSONField 注解,以便实现自定义转换:

  • format 参数用于格式化 date 属性。
  • 默认情况下, FastJson 库可以序列化 Java bean 实体, 但我们可以使用 serialize 指定字段不序列化。
  • 使用 ordinal 参数指定字段的顺序

输出:

[
    {
        "FIRST NAME":"Doe",
        "LAST NAME":"Jhon",
        "DATE OF BIRTH":"19/07/2016"
    },
    {
        "FIRST NAME":"Doe",
        "LAST NAME":"Janette",
        "DATE OF BIRTH":"19/07/2016"
    }
]

四:解析json字符串报文

解析报文:

    @Test
    public void test01(){
        String str1="{'head':{'transSeq':'111111111'},body:{'glblSrlNo':'202111141404123','reqSrlNo':'202111141404123'}}";
        JSONObject jsonObject = JSONObject.parseObject(str1);
        Map head = (Map)jsonObject.get("head");
        String transSeq = (String) head.get("transSeq");
        System.out.println(transSeq);
    }

生成报文:

    @Test
    public void test02(){
        Map map = new HashMap<>();
        Map map1 = new HashMap<>();
        Map map2 = new HashMap<>();
        map1.put("rspCd", "ms00000");
        map1.put("rspInfo", "秘钥生成成功");
        map2.put("glblSrlNo","202111141404123");
        map2.put("reqSrlNo", "202111141404123");
        map.put("head", map1);
        map.put("body", map2);
        String s = JSON.toJSONString(map);
        System.out.println(s);
        //{"head":{"rspCd":"ms00000","rspInfo":"秘钥生成成功"},"body":{"glblSrlNo":"202111141404123","reqSrlNo":"202111141404123"}}
    }

输出:

{
    "head":{
        "rspCd":"ms00000",
        "rspInfo":"秘钥生成成功"
    },
    "body":{
        "glblSrlNo":"202111141404123",
        "reqSrlNo":"202111141404123"
    }
}

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值