JSON工具学习记录--FastJSON

最近做项目,总是与json打交道,在用了即可json工具后,个人认为fastJson最好用,很方便,API也清晰可见,所以记录下使用方法,给需要的人提供帮助.(部分摘抄自网络)

一.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。

对于上面实例解释下:

1. SerializeWriter:相当于StringBuffer

2. JSONArray:相当于List

3. JSONObject:相当于Map

二.使用实例

1.java对象转json串

//代码构造了几个按钮,按钮1,2,3,4是并列关系,5,6是1的子按钮
 @Test
    public void testJson(){
        List<Button> buttons = new ArrayList<>();
        Button button1 = new Button();
        button1.setName("button1");
        button1.setType("click");
        Button button2 = new Button();
        button2.setName("button2");
        button2.setType("click");
        Button button3 = new Button();
        button3.setName("button3");
        button3.setType("click");
        Button button4 = new Button();
        button4.setName("button4");
        button4.setType("click");
        Button button5 = new Button();
        button5.setName("button5");
        button5.setType("click");
        Button button6 = new Button();
        button6.setName("button6");
        button6.setType("click");
        button1.setSub_button(new Button[]{button5, button6});//设置5,6是1的子按钮
        buttons.add(button1);
        buttons.add(button2);
        buttons.add(button3);
        buttons.add(button4);
        String obj = JSON.toJSONString(buttons);
        System.out.println(obj);
    }

看看打印出来的串

[
  {
    "name": "button1",
    "sub_button": [
      {
        "name": "button5",
        "type": "click"
      },
      {
        "name": "button6",
        "type": "click"
      }
    ],
    "type": "click"
  },
  {
    "name": "button2",
    "type": "click"
  },
  {
    "name": "button3",
    "type": "click"
  },
  {
    "name": "button4",
    "type": "click"
  }
]

完全符合预期结果

2.json串转java泛型

还是继续刚才的例子,把刚才得到的串转回去

    //泛型使用这种转换方式
    List<Button> buttons1 = JSON.parseObject(obj, new TypeReference<List<Button>>(){});
        System.out.println(buttons1.toString());

得到结果完全正确

[namebutton1--typeclick--sub_button[Lcom.haikong.model.menu.Button;@27d5a580, namebutton2--typeclick--sub_buttonnull,
namebutton3--typeclick--sub_buttonnull,
namebutton4--typeclick--sub_buttonnull]

3.json转java对象

按照官方文档给出的方法就好了

VO vo = JSON.parseObject("...", VO.class);

4.操纵一个json对象

操纵主要通过下面两个方法

1. JSONArray:相当于List//针对多个对象时转换

2. JSONObject:相当于Map

        JSONArray jsonArray = JSON.parseArray(obj);
        System.out.println(jsonArray.getJSONObject(1).get("name"));//获取json数组中第二个元素的name值

5.时间日期处理

fastjson处理日期的API很简单,例如:

JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd HH:mm:ss.SSS")

使用ISO-8601日期格式

JSON.toJSONString(obj, SerializerFeature.UseISO8601DateFormat);

全局修改日期格式

JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";
JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
  • 反序列化能够自动识别如下日期格式:
  • ISO-8601日期格式
  • yyyy-MM-dd
  • yyyy-MM-dd HH:mm:ss
  • yyyy-MM-dd HH:mm:ss.SSS
  • 毫秒数字
  • 毫秒数字字符串
  • .NET JSON日期格式
  • new Date(198293238)

更多使用参考官方文档即可

6.在springMVC中使用

<mvc:annotation-driven/>默认使用jackjson来解析的,按照下面替换下就可以使用fastjson了
    <!-- 启用默认配置 -->
    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <!-- 配置Fastjson支持 -->
            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json</value>
                    </list>
                </property>
                <property name="features">
                    <list>
                        <value>WriteMapNullValue</value>
                        <value>QuoteFieldNames</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

7.备注

fastjson不支持直接对文件解析操作,可能后续版本会添加这样的功能,所以对于文件,需要先读取出来保存为string,然后才可以解析,这一点需求比较大的话建议用jackjson来解析,后者对文件操作封装的很不错

时间: 2024-08-04 18:52:47

JSON工具学习记录--FastJSON的相关文章

JSON工具学习记录--FastJSON循环引用问题

JSON工具学习记录–FastJSON循环引用问题 标签(空格分隔): fastjson 最近基于他人项目做二次开发,遇到了循环引用的问题,简单来说A引用了B,B引用了C,C引用了A,那么转换json就会无休止的转换下去. 更复杂的情况,A中引用了B,B中引用了一个A的集合,比如广告引用了广告类型,广告类型里面又有该类型下的所属广告. 1.构造情景 这种又叫做双向引用,个人感觉这种设计本身就不是很合理,当然还要看具体使用场景了. 广告类: /** * @author Niu Li * @date

centos 下grep工具学习记录

一.grep工具快速查找表 grep标准正则相关元字符表示及其的含义: 形式 说明 . 这是一个英文的点号.表示匹配任意单个字符: [] 表示匹配指定范围内的任意单个字符: [^] 表示匹配指定范围外的任意单个字符: * 表示匹配前面的条目0次或多次: .* 表示匹配任意长度的任意字符: \? 表示匹配前边的条目至多一次,既 0次或1次: \+ 表示匹配前边的条目1次或多次: \{n\} 表示匹配前边的条目n次,多于n次,少于n次都不可行: \{n,\} 表示匹配前边的条目n次或n次以上,既大于

JSON工具类库: alibaba/fastjson 使用记录

JSON工具类库: alibaba/fastjson 使用记录 一.了解JSON JSON标准规范中文文档: http://www.json.org/json-zh.html 最佳实践:http://kimmking.github.io/2017/06/06/json-best-practice/ (JSON的高级使用,特别十分有参考价值) 二.项目地址和Wiki: Git地址: https://github.com/alibaba/fastjson Wiki:https://github.co

阿里巴巴Json工具-Fastjson讲解

Fastjson是阿里巴巴公司开源的速度最快的Json和对象转换工具,一个Java语言编写的JSON处理器. 1.遵循http://json.org标准,为其官方网站收录的参考实现之一.2.功能qiang打,支持JDK的各种类型,包括基本的JavaBean.Collection.Map.Date.Enum.泛型.3.无依赖,不需要例外额外的jar,能够直接跑在JDK上.4.开源,使用Apache License 2.0协议开源.http://code.alibabatech.com/wiki/d

学习记录: 安装配置自动化工具ansible

学习记录:  安装配置ansible 更新日期: 2016-11-30 系统环境    :centos6.5 本机ip        :192.168.233.123 被管理机ip :192.168.233.124 ------------------------------------- py版本       :   默认python2.6 ansible版本:ansible 1.7.2 ansible参数:             -m  模块名(执行命令)              -a

银联网关跳转支付 学习记录1

最近在做一个项目,里面涉及到了支付功能,使用的是银联的在线支付功能(网关跳转支付).银联给的例子很坑爹,简单的代码只是了一大堆,关键的部分一点儿注释都没有,很多工具类还没有源码.所以学习起来比较吃力.而网上这方面的资料有相对比较少,仅有的一些资料也比较陈旧.所以我打算记录一下我的学习记录,说不定会对别人也有一些帮助. 下载银联Demo 我使用的是银联的网关跳转支付功能,需要完成在线支付,支付完跳转,并接受银联的通知更新自己数据库的功能. 银联技术服务的首页地址是https://open.unio

Python学习记录day5

title: Python学习记录day5 tags: python author: Chinge Yang date: 2016-11-26 1.多层装饰器 多层装饰器的原理是装饰器装饰函数后其实也是一个函数这样又可以被装饰器装饰. 编译是从下至上进行的执行时是从上至下进行. #!/usr/bin/env python # _*_coding:utf-8_*_ ''' * Created on 2016/11/29 20:38. * @author: Chinge_Yang. ''' USER

Spring Boot学习记录(一)--环境搭建

Spring Boot学习记录(一)–环境搭建 标签(空格分隔): spring-boot 最近趁着下班闲时间学习spring-boot,记录下学习历程,最后打算实战一个API管理平台,下面开始环境配置. 1.工程结构 使用maven建立一个普通结构,因为spring-boot内嵌tomcat,所以打包只需要打包成jar就可以直接运行,所以并不像以前那样建立WEB程序了,目录如下,类可以先建立好放在那: 2.引入maven依赖 根据官方教程提示,直接引入parent就可以使用spring-boo

ASP.NETCore学习记录(一)

ASP.NETCore学习记录(一) asp.net core介绍  Startup.cs  ConfigureServices  Configure 0. ASP.NETCore 介绍 ASP.NETCore是一个新的开源和跨平台的框架,用于构建如Web应用.物联网(IoT)应用和移动后端应用等连接到互联网的基于云的现代应用程序.ASP.NET Core应用可运行于.NET Core和完整的.NET Framework之上.构建它的目的是为那些部署在云端或者内部运行的应用提 供一个优化的开发框