FastJson使用示例

简介:

一,几个基本概念

①JSONArray 相当于 JAVA中的List<Object>,如:['a','b','c'....]

②JSONObject相当于JAVA中的Map<String, Object>,如:{'1':'a', '2':'b'...}

③对于具有结构层次的JSON格式的数据,可以一层一层地来解析,可参考:这篇文章

 

二,当待解析的JSON文件很大时,可使用JSON Stream API,比如如下 List类型的数据在 F:\\test.txt 中,假设有上万条时...:

复制代码
[
{"begin_int":"1677721","end_int":"1677747"},
{"begin_int":"1677747","end_int":"1677823"},
{"begin_int":"1677824","end_int":"1677926"},
{"begin_int":"1677926","end_int":"1678131"},
{"begin_int":"1678131","end_int":"1678540"},
{"begin_int":"1678540","end_int":"1679359"},
{"begin_int":"1690880","end_int":"1690905"},
{"begin_int":"1690905","end_int":"1690931"},
{"begin_int":"1690931","end_int":"1690956"},
{"begin_int":"1690956","end_int":"1690982"}
]
复制代码

 

解析代码:将List中的每个元素当作一个Object

复制代码
 1 import java.io.File;
 2 import java.io.FileNotFoundException;
 3 import java.io.FileReader;
 4 
 5 import com.alibaba.fastjson.JSONReader;
 6 
 7 public class ParseListByFastJsonStreamApi {
 8 
 9     private static final String FILE_PATH = "F:\\test.txt";
10     
11     public static void main(String[] args) throws FileNotFoundException{
12         
13         JSONReader jsonReader = new JSONReader(new FileReader(new File(FILE_PATH)));
14         
15         jsonReader.startArray();//---> [
16         
17         while(jsonReader.hasNext())
18         {
19             String info = jsonReader.readObject().toString();//---> {"key":"value"}
20             System.out.println(info);
21         }
22         jsonReader.endArray();//---> ]
23         jsonReader.close();
24     }
25 }
复制代码

 

或者用如下代码来解析:(将List中的每个元素(如: {"begin_int":"1690956","end_int":"1690982"})再进一步分解 成 Key 和 Value 对)

复制代码
 1     public static void parse() throws FileNotFoundException{
 2             
 3             JSONReader jsonReader = new JSONReader(new FileReader(new File(FILE_PATH)));
 4             
 5             jsonReader.startArray();//---> [
 6             
 7             while(jsonReader.hasNext())
 8             {
 9                 jsonReader.startObject();
10                 while(jsonReader.hasNext()) {
11                     String objKey = jsonReader.readString();
12                     String objVal = jsonReader.readObject().toString();
13                     System.out.println("key: " + objKey + ", value: " + objVal);
14                 }
15                 jsonReader.endObject();
16             }
17             jsonReader.endArray();//---> ]
18             jsonReader.close();
19     }
复制代码

上面的第9行 和 第10行解析代码也验证了:“JSONObject相当于JAVA中的Map<String, Object>”。

或者根据 JAVA Bean 类来解析:

复制代码
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;

import com.alibaba.fastjson.JSONReader;

public class ParseListByFastJsonStreamApi {

    private static final String FILE_PATH = "F:\\test.txt";
    
    public static void main(String[] args) throws FileNotFoundException{
        
        JSONReader jsonReader = new JSONReader(new FileReader(new File(FILE_PATH)));
        
        jsonReader.startArray();//---> [
        
        while(jsonReader.hasNext())
        {
            BeginEndBean obj = jsonReader.readObject(BeginEndBean.class);//根据 java bean 来解析
            int begin_int = obj.getBegin_int();
            int end_int = obj.getEnd_int();
            System.out.println("begin_int:" + begin_int + ", end_int" + end_int); 
        }
        jsonReader.endArray();//---> ]
        jsonReader.close();
    }
}
复制代码

 

JAVA Bean类如下:

复制代码
 1 public class BeginEndBean {
 2     private int begin_int;
 3     private int end_int;
 4     public int getBegin_int() {
 5         return begin_int;
 6     }
 7     public void setBegin_int(int begin_int) {
 8         this.begin_int = begin_int;
 9     }
10     public int getEnd_int() {
11         return end_int;
12     }
13     public void setEnd_int(int end_int) {
14         this.end_int = end_int;
15     }
16 }
复制代码

 

三,当需要解析JSON数据格式有点复杂(非扁平的数据)时,比如下面的JSON格式数据:

复制代码
{"key":"value","anotherKey":[
{"begin_int":"1677721","end_int":"1677747"},
{"begin_int":"1687552","end_int":"1690828"},
{"begin_int":"1690905","end_int":"1690931"},
{"begin_int":"1690931","end_int":"1690956"},
{"begin_int":"1690956","end_int":"1690982"}
],"thirdKey":{"subKey":"subVal","anotherSubKey":["1","2","3"]}}
复制代码

"key" 对应的就是只有一个值,"anotherKey"对应的是一个列表,"thirdKey"对应的是一个对象(Map)。

解析代码如下:

第17行,将整个Json格式的文件当作一个JSONObject,该JSONObject里面有三个子元素,分别是:"key" 、"anotherKey"、"thirdKey"。因此第18行 while(hasNext())找到每个key,然后 if-else 分别解析对应的值。比如第25行,解析到"anotherKey"时,它对应的是一个List,因此在第26行 startArray() 来读取

由于List中的每个元素其实又是一个个的:{"begin_int":"1687552","end_int":"1690828"}

因此,第29行又开启 startObject() 读取,而每个{"begin_int":"1687552","end_int":"1690828"} 又有两个 ”xxx_int“:"xxx",因此第30行又有一个while(hasNext())循环。

总之,读取Map格式的数据对应的是JSONObject,读取的方法就是 jsonReader.readObject()

 读取复杂格式的JSON数据时,解析的规则就像是“剥洋葱”一样,一层一层地来解析相应的对象(Object/List)

复制代码
 1 import java.io.File;
 2 import java.io.FileNotFoundException;
 3 import java.io.FileReader;
 4 import com.alibaba.fastjson.JSONReader;
 5 
 6 public class ParseListByFastJsonStreamApi {
 7 
 8     private static final String FILE_PATH = "F:\\test.txt";
 9 
10     public static void main(String[] args) throws FileNotFoundException {
11         parseData();
12     }
13 
14     public static void parseData() throws FileNotFoundException {
15         JSONReader jsonReader = new JSONReader(new FileReader(new File(FILE_PATH)));
16         
17         jsonReader.startObject();//将整个json文件当作 Map<String,Object> 对象来解析 {,}
18         while(jsonReader.hasNext()) {
19             String key = jsonReader.readString();
20             if(key.equals("key"))//"key"对应的Object只有一个
21             {
22                 Object obj = jsonReader.readObject();//
23                 String val = obj.toString();
24                 System.out.println("obj: " + obj + ", value: " + val);
25             }else if(key.equals("anotherKey")) {//"anotherKey"对应的是一个List对象
26                 jsonReader.startArray();//---> [  开启读List对象
27                 while(jsonReader.hasNext()) {
28                     
29                     jsonReader.startObject();
30                     while(jsonReader.hasNext()) {
31                         String objKey = jsonReader.readString();
32                         String objVal = jsonReader.readObject().toString();
33                         System.out.println("objKey: " + objKey + ", objVal: " + objVal);
34                     }
35                     jsonReader.endObject();
36                 }
37                 jsonReader.endArray();//---> ]
38             }else if(key.equals("thirdKey")) {
39                 jsonReader.startObject();//{"subKey":"subVal","anotherSubKey":["1","2","3"]}
40                 while(jsonReader.hasNext()) {
41                     String sub_key = jsonReader.readString();
42                     Object third_obj = jsonReader.readObject();
43                     String subVal = third_obj.toString();
44                     System.out.println("sub_key: " + sub_key + ", subVal: " + subVal);
45                 }
46                 jsonReader.endObject();
47             }
48         }
49         jsonReader.endObject();
50         jsonReader.close();
51     }
52 }
复制代码

 

也可以借助JAVA Bean 来解析 anotherKey 对应的 List 对象。代码如下:

  View Code

 

两种方法的对比如下:

复制代码
 1 else if(key.equals("anotherKey")) {//"anotherKey"对应的是一个List对象
 2                 jsonReader.startArray();//---> [  开启读List对象
 3                 while(jsonReader.hasNext()) {
 4                     BeginEndBean objBean = jsonReader.readObject(BeginEndBean.class);
 5                     int begin_int = objBean.getBegin_int();
 6                     int end_int = objBean.getEnd_int();
 7                     System.out.println("begin_int: " + begin_int + ", " + end_int);
 8                 }
 9                 jsonReader.endArray();//---> ]
10             }
11 
12 
13 ---------------------------------------------------------------------------
14 
15 else if(key.equals("anotherKey")) {//"anotherKey"对应的是一个List对象
16                 jsonReader.startArray();//---> [  开启读List对象
17                 while(jsonReader.hasNext()) {
18                     jsonReader.startObject();
19                     while(jsonReader.hasNext()) {
20                         String objKey = jsonReader.readString();
21                         String objVal = jsonReader.readObject().toString();
22                         System.out.println("objKey: " + objKey + ", objVal: " + objVal);
23                     }
24                     jsonReader.endObject();
25                 }
26                 jsonReader.endArray();//---> ]
27             }
复制代码

 

FastJson 官方github资料

http://www.cnblogs.com/hapjin/p/7242218.html

相关文章
|
缓存 fastjson Java
FastJson - JSONPath 使用
FastJson - JSONPath 使用
1800 0
|
11月前
|
运维 jenkins 持续交付
自动化运维之路:构建高效CI/CD流水线
在软件开发的快节奏中,持续集成和持续部署(CI/CD)流水线是提升效率、保障质量的关键。本文将引导你理解CI/CD流水线的重要性,并手把手教你如何搭建一个高效的自动化运维系统。通过实际代码示例,我们将一步步实现从代码提交到自动测试、部署的全流程自动化,确保软件交付过程既快速又可靠。
|
机器学习/深度学习 人工智能 自然语言处理
机器学习系列1 机器学习历史
 人工智能(AI)作为计算机领域与机器学习的历史交叉点,随着支撑机器学习的算法和算力的增长,AI的发展也得到进步。值得关注的是,虽然这些研究从1950年代已经开始出现,但重要的算法:统计,数学,计算等相关技术理论的发现远早于这个时代。事实上,人们已经思考这些问题数百年 。本文将讨论“思考机器”概念的历史知识基础。
414 0
|
SQL 前端开发 关系型数据库
MySQL only_full_group_by 1055 报错的三种解决方案,临时关闭有影响吗?
当我们迁移到 MySQL 5.7+ 的版本时,常会碰到 `ERROR 1055 only_full_group_by` 错误,这是 5.7 之后 `SQL_MODE` 默认打开了严格模式导致的错误。说明你代码里有地方写的不严谨。
1590 0
|
机器学习/深度学习 人工智能 自然语言处理
【大模型】大语言模型前沿技术系列讲座-学习笔记1:人工智能发展史
【大模型】大语言模型前沿技术系列讲座-学习笔记1:人工智能发展史
|
算法 安全 数据安全/隐私保护
C/C++学习 -- 分组密算法(3DES算法)
C/C++学习 -- 分组密算法(3DES算法)
407 0
|
机器学习/深度学习 算法
深度强化学习常用算法
深度强化学习常用算法
318 0
|
Kubernetes Cloud Native API
带你读《云原生应用开发:Operator原理与实践》——1.2.1 Operator 简介
带你读《云原生应用开发:Operator原理与实践》——1.2.1 Operator 简介
带你读《云原生应用开发:Operator原理与实践》——1.2.1 Operator 简介
|
SQL 监控 专有云
分布式服务架构下的混沌工程实践
本文来自阿里巴巴高可用架构团队高级开发工程师肖长军(花名穹谷)在 GIAC(全球互联网架构大会)上的分享,包含三部分内容:(阿里巴巴中间件公众号对话框发送“混沌工程”,获取分享PPT) 混沌工程的定义、价值、原则和流程; 混沌工程如何在企业中落地,以及 ChaosBlade 和混沌实验平台 AHAS Chaos 架构设计; 结合两个具体案例介绍了分布式服务下的混沌工程实践; 大家好,我是来自阿里的肖长军,今天给大家分享混沌工程在分布式服务架构下的具体实践。
22036 111
|
SQL 开发框架 .NET
calcite入门02-连接多数据源
calcite入门02-连接多数据源
733 0