JSONObject和JSONArray区别及注意事项

news2025/7/9 10:44:59

1、JSONObject和JSONArray的数据表示形式

JSONObject的数据是用 { } 来表示的,

    例如:   {"name":"John","age":30,"city":"New York"}

而JSONArray,顾名思义是由JSONObject构成的数组,用 [ { } , { } , … , { } ] 来表示

   例如:   [{"name":"John","age":30,"city":"New York"}] ; 

2、解析json及可能遇到的问题

		String str1 = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}";
        String str2 = "[{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}]";
        JSONObject jsonObject = JSONObject.parseObject(str1);
        JSONArray jsonArray = JSONArray.parseArray(str2);

jsonObject对象如下
在这里插入图片描述
解析jsonArray的对象如下:
在这里插入图片描述
如果执行下面的代码

		String str1 = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}";
        String str2 = "[{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}]";
        JSONObject jsonObject = JSONObject.parseObject(str2);
        JSONArray jsonArray = JSONArray.parseArray(str1);

则会抛异常,即对象形式的json不能用parseArray进行解析,数组形式的json也不能用parseObject进行解析。

3、解决方案

可以使用JSON.parse()方法,该方法会自动判断json的类型,然后调不同的方法进行反解析。若需要需要知道具体对象,通过如下的方式进一步判断就可以了

	   Object obj = JSON.parse(jsonString);
       if (obj instanceof JSONObject) {
           JSONObject jsonObject = (JSONObject) obj;  
       } else if (obj instanceof JSONArray) {
           JSONArray jsonArray = (JSONArray) obj;
           }
       }

JSON.parse()方法中判断json串是什么类型的代码如下:

public DefaultJSONParser(Object input, JSONLexer lexer, ParserConfig config) {
        this.resolveStatus = 0;
        this.derializer = new DefaultObjectDeserializer();
        this.contextArray = new ParseContext[8];
        this.contextArrayIndex = 0;
        this.resolveTaskList = new ArrayList();
        this.dateFormatPattern = JSON.DEFFAULT_DATE_FORMAT;
        this.input = input;
        this.lexer = lexer;
        this.config = config;
        this.symbolTable = config.getSymbolTable();
        lexer.nextToken(12);
    }

public void nextToken(int expect) {
        while(true) {
            switch (expect) {
                case 2:
                    if (this.ch >= '0' && this.ch <= '9') {
                        this.sp = 0;
                        this.pos = this.bp;
                        this.scanNumber();
                        return;
                    }

                    if (this.ch == '"') {
                        this.sp = 0;
                        this.pos = this.bp;
                        this.scanString();
                        return;
                    }

                    if (this.ch == '[') {
                        this.token = 14;
                        this.ch = this.buf[++this.bp];
                        return;
                    }

                    if (this.ch == '{') {
                        this.token = 12;
                        this.ch = this.buf[++this.bp];
                        return;
                    }
                case 3:
                case 5:
                case 6:
                case 7:
                case 8:
                case 9:
                case 10:
                case 11:
                case 13:
                case 17:
                case 18:
                case 19:
                default:
                    break;
                case 4:
                    if (this.ch == '"') {
                        this.sp = 0;
                        this.pos = this.bp;
                        this.scanString();
                        return;
                    }

                    if (this.ch >= '0' && this.ch <= '9') {
                        this.sp = 0;
                        this.pos = this.bp;
                        this.scanNumber();
                        return;
                    }

                    if (this.ch == '[') {
                        this.token = 14;
                        this.ch = this.buf[++this.bp];
                        return;
                    }

                    if (this.ch == '{') {
                        this.token = 12;
                        this.ch = this.buf[++this.bp];
                        return;
                    }
                    break;
                case 12:  //默认传进来的的expect就是12,所以会走到这个分支里边,会根据json串的情况给token赋值不同的值
                    if (this.ch == '{') { 
                        this.token = 12;
                        this.ch = this.buf[++this.bp];
                        return;
                    }

                    if (this.ch == '[') {
                        this.token = 14;
                        this.ch = this.buf[++this.bp];
                        return;
                    }
                    break;
                case 14:
                    if (this.ch == '[') {
                        this.token = 14;
                        this.ch = this.buf[++this.bp];
                        return;
                    }

                    if (this.ch == '{') {
                        this.token = 12;
                        this.ch = this.buf[++this.bp];
                        return;
                    }
                    break;
                case 15:
                    if (this.ch == ']') {
                        this.token = 15;
                        this.ch = this.buf[++this.bp];
                        return;
                    }
                case 20:
                    if (this.ch == 26) {
                        this.token = 20;
                        return;
                    }
                    break;
                case 16:
                    if (this.ch == ',') {
                        this.token = 16;
                        this.ch = this.buf[++this.bp];
                        return;
                    }

                    if (this.ch == '}') {
                        this.token = 13;
                        this.ch = this.buf[++this.bp];
                        return;
                    }

                    if (this.ch == ']') {
                        this.token = 15;
                        this.ch = this.buf[++this.bp];
                        return;
                    }

                    if (this.ch == 26) {
                        this.token = 20;
                        return;
                    }
            }

            if (this.ch != ' ' && this.ch != '\n' && this.ch != '\r' && this.ch != '\t' && this.ch != '\f' && this.ch != '\b') {
                this.nextToken();
                return;
            }

            this.ch = this.buf[++this.bp];
        }
    }

在解析的主代码如下

public Object parse(Object fieldName) {
        JSONLexer lexer = this.getLexer();
        switch (lexer.token()) {
            case 2:
                Number intValue = lexer.integerValue();
                lexer.nextToken();
                return intValue;
            case 3:
                Object value = lexer.decimalValue(this.isEnabled(Feature.UseBigDecimal));
                lexer.nextToken();
                return value;
            case 4:
                String stringLiteral = lexer.stringVal();
                lexer.nextToken(16);
                if (lexer.isEnabled(Feature.AllowISO8601DateFormat)) {
                    JSONScanner iso8601Lexer = new JSONScanner(stringLiteral);
                    if (iso8601Lexer.scanISO8601DateIfMatch()) {
                        return iso8601Lexer.getCalendar().getTime();
                    }
                }

                return stringLiteral;
            case 6:
                lexer.nextToken();
                return Boolean.TRUE;
            case 7:
                lexer.nextToken();
                return Boolean.FALSE;
            case 8:
                lexer.nextToken();
                return null;
            case 9:
                lexer.nextToken(18);
                if (lexer.token() != 18) {
                    throw new JSONException("syntax error");
                }

                lexer.nextToken(10);
                this.accept(10);
                long time = lexer.integerValue().longValue();
                this.accept(2);
                this.accept(11);
                return new Date(time);
            case 12:   //token就用在这里,可以看到这里就是调的parseObject
                JSONObject object = new JSONObject();
                return this.parseObject(object, fieldName);
            case 14: //这里就是调的parseArray
                JSONArray array = new JSONArray();
                this.parseArray(array, fieldName);
                return array;
            case 20:
                if (lexer.isBlankInput()) {
                    return null;
                }
            case 5:
            case 10:
            case 11:
            case 13:
            case 15:
            case 16:
            case 17:
            case 18:
            case 19:
            default:
                throw new JSONException("TODO " + lexer.tokenName() + " " + lexer.stringVal());
            case 21:
                lexer.nextToken();
                HashSet<Object> set = new HashSet();
                this.parseArray(set, fieldName);
                return set;
            case 22:
                lexer.nextToken();
                TreeSet<Object> treeSet = new TreeSet();
                this.parseArray(treeSet, fieldName);
                return treeSet;
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1103443.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NSS [BJDCTF 2020]easy_md5

NSS [BJDCTF 2020]easy_md5 先看题目&#xff0c;给了一个输入框 翻阅了源码没发现什么可疑点 扫一下试试&#xff0c;也没东西 抓个包试试&#xff0c;在响应头发现了hint 那就是奇妙的md5了&#xff0c;输入ffifdyop 原理&#xff1a; ffifdyop的MD5加密结果是276f722736c…

探索音频传输系统:数字声音的无限可能 | 百能云芯

音频传输系统是一项关键的技术&#xff0c;已经在数字时代的各个领域中广泛应用&#xff0c;从音乐流媒体到电话通信&#xff0c;再到多媒体制作。本文将深入探讨音频传输系统的定义、工作原理以及在现代生活中的各种应用&#xff0c;以帮助您更好地了解这一重要技术。 音频传输…

SDK入门

目录 控制台程序 与 Windows程序 Windows程序与Console程序入口的区别 代码编写区别 SDK 基本概念 VS2019 SDK VS2019创建桌面应用程序 ANSI 与 Unicode TCHAR char wchat_t 解决编码的影响 MessageBox() 第一个SDK程序 MessageBox函数 控制台程序 与 Windows程序 …

PPC-R22.1N-T-Q2-G2-NN-FW 使用反馈来解决误差和系统干扰

PPC-R22.1N-T-Q2-G2-NN-FW 使用反馈来解决误差和系统干扰 伺服机构是自动控制系统&#xff0c;用于从数控机床&#xff0c;机器人技术&#xff0c;仓库自动化还有更多。与开环系统相比&#xff0c;带伺服驱动器的闭环系统在运动应用中具有更高的可靠性和精度。怎么会&#xff…

Spring系列综合

目录 1 Spring介绍2 Spring核心技术3 Spring入门案例3.1 Spring jar包下载(了解)3.2 通过mven方式导入jar包3.3 编辑application.xml文件3.4 编辑测试类 4 Spring核心技术IOC4.1 什么是IOC4.2 IOC实现原理 5 Spring创建对象方式5.1 静态工厂模式5.1.1 编辑静态工厂类5.1.2 编辑…

请求分页管理方式(页表机制,缺页中断,地址变换)

请求分页存储管理与基本分页存储管理的主要区别: 在程序执行过程中&#xff0c;当所访问的信息不在内存时&#xff0c;由操作系统负责将所需信息从外存调入内存&#xff0c;然后继续执行程序。&#xff08;操作系统要提供请求调页功能&#xff0c;将缺失页面从外存调入内存)若…

MapReduce任务个数如何影响执行效率?性能优化从这里做起

在正文开始之前&#xff0c;请先来回答一下这个问题&#xff1a; 题目&#xff1a;输入为3个文件&#xff0c;a.txt 300MB,b.txt 100MB,c.txt 58.MB&#xff0c;使用MapReduce的example程序&#xff0c;计算Wordcount&#xff0c;请问&#xff0c;应该有多少个MapTask&#xf…

分享一种非隔离控制三象限双向可控硅的产品级电路

上图是一款在美国卖得很火的挂烫机的电源电路和双向可控硅控制电路&#xff0c;可以看到电源部分采用的是阻容降压&#xff0c;阻容降压电路适用于低成本小电流的应用场合&#xff0c;根据电容容抗的计算公式Xc1/(2πfC) 可算出容抗大小&#xff0c;&#xff08;f为市电的频率5…

编译和链接(小白初理解)

目录 1. 翻译环境和运⾏环境 1.2翻译环境 2. 翻译环境&#xff1a;预编译编译汇编链接 2.1预处理&#xff08;预编译&#xff09;阶段 2.2编译 2.2.1词法分析 2.2.2语法分析 2.2.3语义分析 2.3 汇编 2.4 链接 3. 运⾏环境 1. 翻译环境和运⾏环境 翻译环境指的是&a…

设计模式截图记录

设计模式截图记录

GeoServer改造Springboot启动五(解决接口返回xml而不是json)

请求接口返回的是xml&#xff0c;而不是我们常用的json&#xff0c;问题呈现如下图 40 图 40请求接口返回XML 在RequestMapping注解上增加produces {MediaType.APPLICATION_JSON_UTF8_VALUE} 图 41增加produces

AP8100 DC-DC 升压恒压电源管理芯片

说明 AP8100 是一款外围电路简单的 BOOST 升压恒压控 制驱动芯片&#xff0c;适用于 2.8-40V 输入电压范围的升压恒 压电源应用领域&#xff0c;启动电压可以低至 2.5V。 芯片会根据负载的大小自动切换 PWM &#xff0c; PFM 和 BURST 模式以提高各个负载端的电源系统效率。 本…

跨境电商系统源码分享,助力企业快速搭建电商平台

在如今的全球化时代&#xff0c;跨境电商成为了许多企业拓展国际市场的重要途径。然而&#xff0c;搭建一个完善的跨境电商系统并不是一件容易的事情。幸运的是&#xff0c;有许多跨境电商系统的现成源码可供使用&#xff0c;以解决企业在电商过程中遇到的各种难题。 一、现成源…

[架构之路-239]:目标系统 - 纵向分层 - 中间件middleware

目录 前言&#xff1a; 一、中间件概述 1.1 中间件在软件层次中的位置 1.2 什么是中间件 1.3 为什么需要中间件 1.4 中间件应用场合&#xff08;应用程序不用的底层需求&#xff1a;计算、存储、通信&#xff09; 1.5 中间件分类 - 按内容分 二、嵌入式系统的中间件 2…

基于SpringBoot的漫画动漫网站

基于SpringBootVue的漫画动漫网站的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 动漫详情 排行榜 通知公告 管理员界面 摘要 基于SpringBoot的漫画动漫网…

confluence8.5.1版本升级到8.5.2

由于confluence的漏洞CVE-2023-22515的出现&#xff0c;现在需要升级版本 查看漏洞已修复版本&#xff1a; 需要升级到8.5.2 下载软件包&#xff1a; https://product-downloads.atlassian.com/software/confluence/downloads/atlassian-confluence-8.5.2-x64.bin 完成后上传…

浅谈新能源电动汽车充电设施的建设及运营平台分析

安科瑞 崔丽洁 摘要&#xff1a;在社会经济发展的新时期&#xff0c;我国城市化的水平也在随之不断的提高&#xff0c;使我国制造业迅速崛起&#xff0c;并加剧了该行业的竞争力&#xff0c;要想使企业在竞争中占据有力的位置&#xff0c;企业就要顺应时代发展的潮流&#xff0…

Linux之iostat溯源diskstats

iostat 默认输出解析详细输出解析关键指标 diskstats字段解析await的计算来源计算方法 svctm计算来源计算方法 util的计算来源计算方法 系统级别的IO工具 默认输出解析 iostat%usr CPU在用户模式下的时间百分比%nice CPU处在带NICE值的用户模式下的时间百分比%system CPU在系统…

11+肠道微生物群+孟德尔随机化

今天给同学们分享一篇孟德尔随机化的生信文章“Causal relationship between gut microbiota and cancers: a two-sample Mendelian randomisation study ”&#xff0c;这篇文章于2023年2月21日发表在 BMC Med 期刊上&#xff0c;影响因子为11.15。 观察性研究和临床试验的…