FastJson的使用

介绍

FastJson据说是目前为止最快的JSON库,好吧,他说是就是了。

FastJson 的Wiki在这里:https://github.com/alibaba/fastjson/wiki/

Quick_Start 在这里:https://github.com/alibaba/fastjson/wiki/Quit_Start_cn

FastJson的API非常简单:

String text = JSON.toJSONString(obj); //序列化
VO vo = JSON.parseObject("{...}", VO.class); //反序列化

上代码

接着,上菜,不,上代码: 这里需要注意一个核心思想:JSON中的键值对就是Java中的Map,JSON中的数组就是Java中的List

POJO对象

package com.owen.fastjson.bean;

/**
 * POJO对象
 * 
 * @author Owen
 */
public class UserInfo {

    private String name;

    private int age;

    /**
     * FastJSON要求:需要提供默认构造方法
     */
    public UserInfo() {}

    public UserInfo(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

测试类

package com.owen.fastjson.app;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.owen.fastjson.bean.UserInfo;

/**
 * 测试类
 * 
 * @author Owen
 */
public class Main {

    /**
     * 简单序列化
     */
    private static void simpleTest() {
        UserInfo userInfo = new UserInfo("owen", 24);
        String jsonStr = JSON.toJSONString(userInfo);
        System.out.println(jsonStr);
    }

    /**
     * 复杂序列化
     */
    public static void complexTest() {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("username", "owen");
        map.put("age", 25);
        map.put("sex", "男");

        Map<String, Object> temp = new HashMap<String, Object>();
        temp.put("name", "jack");
        temp.put("age", 18);
        map.put("girinfo", temp);

        List<String> list = new ArrayList<String>();
        list.add("爬山");
        list.add("电影");
        list.add("旅游");
        map.put("hobby", list);

        String jsonStr = JSON.toJSONString(map);
        System.out.println(jsonStr);
    }

    /**
     * 日期序列化
     */
    public static void DateTest() {
        Date date = new Date();
        // 默认输出
        System.out.println("时间戳=" + JSON.toJSONString(date));
        // 默认的日期格式
        System.out.println("当前日期=" + JSON.toJSONString(date, SerializerFeature.WriteDateUseDateFormat));
        // 使用指定的日期格式
        System.out.println("当前日期=" + JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd HH:mm:ss", SerializerFeature.WriteDateUseDateFormat));
    }

    /**
     * 简单反序列化
     */
    public static void simpleDeserializeTest() {
        String userInfoJSONStr = "{\"name\":\"owen\", \"age\":24}";
        UserInfo userInfo = JSON.parseObject(userInfoJSONStr, UserInfo.class);
        System.out.println("name = " + userInfo.getName() + ", age = " + userInfo.getAge());
    }

    /**
     * 泛型反序列化
     */
    public static void genericTypeDeserializeTest() {
        String jsonStr = "{\"user\":{\"name\":\"owen\", \"age\":24}";
        Map<String, UserInfo> map = JSON.parseObject(jsonStr, new TypeReference<Map<String, UserInfo>>() {});
        System.out.println(map.get("user").getAge() + "\n");

        String jsonStr2 = "{\"user\":[{\"name\":\"owen\", \"age\":24}, {\"name\":\"jack\", \"age\":18}]";
        Map<String, List<UserInfo>> users = JSON.parseObject(jsonStr2, new TypeReference<Map<String, List<UserInfo>>>() {});
        for (UserInfo info : users.get("user")) {
            System.out.println("name=" + info.getName());
            System.out.println("age=" + info.getAge());
            System.out.println("------------------");
        }
    }

    /**
     * test
     */
    public static void main(String[] args) {
        genericTypeDeserializeTest();
    }

}

import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer;  import com.alibaba.fastjson.serializer.SimplePropertyPreFilter;  public class TestFastjson {  //fastjson序列化单个对象 与反序列化  @Test  public void test1() {  Employee e = new Employee("001", "张三", 23, new Date());  //序列化  String jsonStr = JSON.toJSONString(e);  System.out.println(jsonStr);  //反序列化  Employee emp = JSON.parseObject(jsonStr, Employee.class);  System.out.println(emp.getName());  }  //fastjson序列化list集合 与反序列化  @Test  public void test2() {  Employee e = new Employee("001", "张三", 23, new Date());  Employee e2 = new Employee("002", "李四", 29, new Date());  List<Employee> emps = new ArrayList<Employee>();  emps.add(e);  emps.add(e2);  //fastjson序列化list, 返回来的是一个json数组,由[]包含两个json  String jsonArryStr = JSON.toJSONString(emps);  System.out.println(jsonArryStr);  // //反序列化  //法一  // List<Employee> empList = JSON.parseObject(jsonArryStr, new TypeReference<List<Employee>>(){} );  //法二  List<Employee> empList = JSON.parseArray(jsonArryStr,Employee.class);  for (Employee employee : empList) {  System.out.println(employee.getName());  System.out.println(employee.getBirthDay());  }  }  //fastjson序列化复杂对象 与反序列化  @Test  public void test3() {  Employee e = new Employee("001", "张三", 23, new Date());  Employee e2 = new Employee("002", "李四", 29, new Date());  List<Employee> emps = new ArrayList<Employee>();  emps.add(e);  emps.add(e2);  Dept dept = new Dept("d001", "研发部", emps);  //序列化  String jsonStr = JSON.toJSONString(dept);  System.out.println(jsonStr);  //反序列化  Dept d = JSON.parseObject(jsonStr, Dept.class);  System.out.println(d.getName());  //json转map  //法一  Map<String, Object> map1 = JSON.parseObject(jsonStr);//返回JSONObject,JSONObject实现Map<String, Object>接口  //法二  // Map<String, Object> map1 = (Map<String, Object>)JSON.parse(jsonStr);  for (String key : map1.keySet()) {  System.out.println(key + ":" + map1.get(key));  }  }  //fastjson 的 JSONObject的使用  @Test  public void test4() {  Employee e = new Employee("001", "张三", 23, new Date());  //序列化  String jsonStr = JSON.toJSONString(e);  System.out.println(jsonStr);  //反序列化 (可以和test1比较)   JSONObject emp = JSON.parseObject(jsonStr, JSONObject.class);  System.out.println(emp);  System.out.println(emp.getString("name"));  //再放一个Employee不存在的字段  emp.put("salary", "8000");  System.out.println(emp.toJSONString());  System.out.println(emp.get("salary"));  }  //fastjson序列化字符串  @Test  public void test5(){  List<String> strs = new ArrayList<String>();  strs.add("hello");  strs.add("world");  strs.add("banana");  //序列化  String jsonStr = JSON.toJSONString(strs);  System.out.println(jsonStr);  //反序列化  List<String> strList = JSON.parseObject(jsonStr, new TypeReference<List<String>>(){} );  // List<String> strList = JSON.parseArray(jsonStr, String.class);//等同于上一句  for (String str : strList) {  System.out.println(str);  }  }  //fastjson过滤字段  @Test  public void test6() {  Employee e = new Employee("001", "张三", 23, new Date());  Employee e2 = new Employee("002", "李四", 29, new Date());  List<Employee> emps = new ArrayList<Employee>();  emps.add(e);  emps.add(e2);  //构造过滤器  SimplePropertyPreFilter filter = new SimplePropertyPreFilter(Employee.class, "id", "age");  String jsonStr =JSON.toJSONString(emps, filter);  System.out.println(jsonStr);  }  //fastjson 日期处理  @Test  public void test7(){  Date date = new Date();  String dateStr = JSON.toJSONString(date);  System.out.println(dateStr);  String dateStr2 = JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd HH:mm:ss");  System.out.println(dateStr2);  //序列化实体  Employee emp = new Employee("001", "张三", 23, new Date());  //法一  String empStr = JSON.toJSONStringWithDateFormat(emp, "yyyy-MM-dd HH:mm:ss");  System.out.println(empStr);  //法二  String empStr2 = JSON.toJSONString(emp, SerializerFeature.WriteDateUseDateFormat);  System.out.println(empStr2);  //法三  SerializeConfig config = new SerializeConfig();  config.put(Date.class, new SimpleDateFormatSerializer("yyyy年MM月dd日 HH时mm分ss秒"));  String empStr3 = JSON.toJSONString(emp, config);  System.out.println(empStr3);  }  //fastjson 去掉值的双引号 实现JSONAware接口  @Test  public void test8(){  //见同级目录的Function.java  }  //fastjson 注解形式  (别名命名, 过滤字段, 日期格式)  @Test  public void test9(){  Student stu = new Student("001", "张三", 23, new Date());  String jsonStr = JSON.toJSONString(stu);  System.out.println(jsonStr);  }  }

文/程序猴(简书作者) 原文链接:http://www.jianshu.com/p/a04c428963a2 著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏算法修养

PAT 甲级 1104 sum of Number Segments

1104. Sum of Number Segments (20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16...

28550
来自专栏熊二哥

JDK1.8快速入门

JDK8提供了非常多的便捷用法和语法糖,其编码效率几乎接近于C#开发,maven则是java目前为止最赞的jar包管理和build工具,这两部分内容都不算多,就...

21990
来自专栏javascript趣味编程

5.2.3 二维导热算例-整体架构

13800
来自专栏算法修养

Code Forces 652C Foe Pairs

C. Foe Pairs time limit per test 1 second memory limit per test 256 megaby...

33880
来自专栏码匠的流水账

聊聊flink的FsCheckpointStreamFactory

flink-runtime_2.11-1.7.0-sources.jar!/org/apache/flink/runtime/state/CheckpointS...

12820
来自专栏HansBug's Lab

1622: [Usaco2008 Open]Word Power 名字的能量

1622: [Usaco2008 Open]Word Power 名字的能量 Time Limit: 5 Sec  Memory Limit: 64 MB Su...

27940
来自专栏HansBug's Lab

2431: [HAOI2009]逆序对数列

2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 954  Solv...

29660
来自专栏深度学习计算机视觉

蓝桥杯试题算法学习笔记一题目

题目 1、熊怪吃核桃 森林里有一只熊怪,很爱吃核桃。不过它有个习惯,每次都把找到的核桃分成相等的两份,吃掉一份,留一份。如果不能等分,熊怪就会扔掉一个核桃再分。...

52360
来自专栏数据之美

java 中 16 进制 HEX 转换成字节码形式的 UTF-8

恩,又碰到个蛋疼的编码转换问题了:要把形如 \xE9\xBB 的字符串转成中文。。。 在python中我们直接 print "\xE9\xBB\x84" ...

27550
来自专栏函数式编程语言及工具

Scalaz(55)- scalaz-stream: fs2-基础介绍,fs2 stream transformation

    fs2是scalaz-stream的最新版本,沿用了scalaz-stream被动式(pull model)数据流原理但采用了全新的实现方法。fs2比较...

24460

扫码关注云+社区

领取腾讯云代金券