开源工程学习笔记之Fastjson(Part 0)

本文介绍了 Fastjson 这款 Java 高性能 JSON 库的基本使用方法,包括如何将 JSON 文本解析为 Java 对象以及如何将 Java 对象序列化为 JSON 文本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Part 0.为啥要拆它?

最近实验室任务量不大,故决定找一些不错的开源项目拆开看看,学习下设计模式和实现工程的细节。看一看一些优秀的工程都是怎么实现的。

前几天刚帮同学拆了一个超轻量级的json框架cJSON,发现拆开源工程的感觉很不错,于是找了下Java的解决方案,比较有代表性的有谷歌的gson和阿里的fastjson。作为国人就先拆国产作品吧~~

首先我们要知道这东西是什么,怎么用,再从入口点开始逐步剥皮。

0.1 Fastjson是什么?

Fastjson是一个Java语言编写的高性能功能完善的JSON库。它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON库。Fastjson接口简单易用,已经被广泛使用在缓存序列化、协议交互、Web输出、Android客户端等多种应用场景。

0.2 Fastjson怎么用?

Fastjson的最主要的使用入口是com.alibaba.fastjson.JSON,接口如下:

import com.alibaba.fastjson.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。

下面分别演示一下:
首先我们用作示例的json串是这样的:

{
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": [
                            "GML",
                            "XML"
                        ]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}

首先运行这段代码:

public static void main( String[] args )
{
    String text="{\"glossary\":{\"title\":\"example glossary\",\"GlossDiv\":{\"title\":\"S\",\"GlossList\":{\"GlossEntry\":{\"ID\":\"SGML\",\"SortAs\":\"SGML\",\"GlossTerm\":\"Standard Generalized Markup Language\",\"Acronym\":\"SGML\",\"Abbrev\":\"ISO 8879:1986\",\"GlossDef\":{\"para\":\"A meta-markup language, used to create markup languages such as DocBook.\",\"GlossSeeAlso\":[\"GML\",\"XML\"]},\"GlossSee\":\"markup\"}}}}}";
    Object json = JSON.parse(text);
    System.out.println(json);
}

可以看到输出了一个JSONObject,parseObject(text)parseArray(text)也类似。

public static void main( String[] args )
{
    String text="{\"glossary\":{\"title\":\"example glossary\",\"GlossDiv\":{\"title\":\"S\",\"GlossList\":{\"GlossEntry\":{\"ID\":\"SGML\",\"SortAs\":\"SGML\",\"GlossTerm\":\"Standard Generalized Markup Language\",\"Acronym\":\"SGML\",\"Abbrev\":\"ISO 8879:1986\",\"GlossDef\":{\"para\":\"A meta-markup language, used to create markup languages such as DocBook.\",\"GlossSeeAlso\":[\"GML\",\"XML\"]},\"GlossSee\":\"markup\"}}}}}";
    JsonBean bean = JSON.parseObject(text, JsonBean.class);
    System.out.println(bean);
}

在这里我们建了一个JavaBean,用来对应Json串的各个字段,运行这段代码后,发现JSON串的值已经准确的装入javabean中。
控制台输出如下:

JsonBean [glossary=Glossary [title=example glossary, glossdiv=Glossdiv [title=S, glosslist=Glosslist [glossentry=Glossentry [id=SGML, sortas=SGML, glossterm=Standard Generalized Markup Language, acronym=SGML, abbrev=ISO 8879:1986, glossdef=Glossdef [para=A meta-markup language, used to create markup languages such as DocBook., glossseealso=[GML, XML]], glosssee=markup]]]]]

以上是反序列化部分,就是对json串的解析。

接下来看看序列化部分是什么样的。

按上面的程序,我们已经得到了javabean,下面把他还原成json。

public static void main( String[] args )
{
    String text="{\"glossary\":{\"title\":\"example glossary\",\"GlossDiv\":{\"title\":\"S\",\"GlossList\":{\"GlossEntry\":{\"ID\":\"SGML\",\"SortAs\":\"SGML\",\"GlossTerm\":\"Standard Generalized Markup Language\",\"Acronym\":\"SGML\",\"Abbrev\":\"ISO 8879:1986\",\"GlossDef\":{\"para\":\"A meta-markup language, used to create markup languages such as DocBook.\",\"GlossSeeAlso\":[\"GML\",\"XML\"]},\"GlossSee\":\"markup\"}}}}}";
    JsonBean bean = JSON.parseObject(text, JsonBean.class);

    String text2 = JSON.toJSONString(bean);
    System.out.println(text2);
}

执行一下,控制台输出了原来那个json,和text串是等价的。

等等,原来的接口里面还有个重载函数,可以加布尔值,那么我们加个true试试:String text2 = JSON.toJSONString(bean,true);

恩,这下控制台输出的就不是一行了,而是看起来更易读的形式:

{
    "glossary":{
        "glossdiv":{
            "glosslist":{
                "glossentry":{
                    "abbrev":"ISO 8879:1986",
                    "acronym":"SGML",
                    "glossdef":{
                        "glossseealso":[
                            "GML",
                            "XML"
                        ],
                        "para":"A meta-markup language, used to create markup languages such as DocBook."
                    },
                    "glosssee":"markup",
                    "glossterm":"Standard Generalized Markup Language",
                    "id":"SGML",
                    "sortas":"SGML"
                }
            },
            "title":"S"
        },
        "title":"example glossary"
    }
}

没错,这个参数叫prettyFormat,打印出来的确实pretty多了~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值