JSONObject和JSONArray区别及注意事项

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就用在这里,可以看到这里就是调的parseObjectJSONObject object = new JSONObject();return this.parseObject(object, fieldName);case 14: //这里就是调的parseArrayJSONArray 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.rhkb.cn/news/161569.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nodejs原型链污染学习

文章目录 前置知识JavaScript数据类型prototype原型同步和异步child_process模块 原型链污染利用条件 实例 前置知识 JavaScript数据类型 let和var关键字的区别 使用var或let关键字可以定义变量 let和var的区别如下&#xff1a; var是全局作用域&#xff0c;let 只在当前代码…

只会Python,怎么用PC控制无人机自动飞行?

PC-SDK是阿木实验室 (AMOVLAB) 为了简化开源飞控的控制协议MAVLink&#xff0c;优化和维护的一个基于PC电脑运行MAVSDK(支持Windows和Ubuntu)的Python SDK库。 相对于传统的无人机控制开发&#xff0c;开发者无需掌握C/C语言和ROS等相关知识&#xff0c;只要学会Python编程及懂…

你的助听器装置效果好吗?

作者&#xff1a;兰明 助听效果的好坏是一个多维的概念&#xff0c;简单的讲就是能使听障人士成功地应付生活的程度。影响助听装置效果的因素主要有三个方面&#xff1a;听障人士自身的因素、助听装置本身的因素以及专业服务的因素。其中病史超过半年的听障人士自身的因素&…

ubuntu 18.04 LTS交叉编译opencv 3.4.16并编译工程[全记录]

一、下载并解压opencv 3.4.16源码 https://opencv.org/releases/ 放到home路径下的Exe文件夹&#xff08;专门放用户安装的软件&#xff09;中&#xff0c;其中build是后期自建的 为了版本控制&#xff0c;保留了3.4.16&#xff0c;并增加了-gcc-arm 二、安装cmake和cmake-g…

查看双翌视觉软件版本号

查看双翌视觉软件版本号 MasterAlign视觉对位软件 MasterAlign视觉对位软件的版本号在软件界面的右下角&#xff0c;如下图所示&#xff1a; 进入界面查看右下角编号尾号为O的代表旧协议版本 而编号尾号为N的则为新协议版本。 WiseAlign视觉对位软件 打开WiseAlign视觉对位软…

新版pycharm(2023.2.2)修改字体大小

下载了2023新版pycharm&#xff0c;想修改字体&#xff0c;发现找不到之前的setting入口&#xff0c;网上搜索也都是file-setting-editor这些&#xff0c;自己找了找&#xff0c;记录下 2023版pycharm的修改字体大小在file-Manage IDE Settings-Setting Sync… 里面&#xff0…

RocketMQ高性能核心原理与源码架构剖析

文章目录 一、源码环境搭建主要功能模块源码启动服务启动nameServer启动Broker发送消息消费消息 二、源码热身阶段NameServer的启动过程关注重点源码重点 Broker服务启动过程关注重点源码重点 Netty服务注册框架关注重点源码重点关于RocketMQ的同步结果推送与异步结果推送 Brok…

堆/二叉堆详解[C/C++]

前言 堆是计算机科学中-类特殊的数据结构的统称。实现有很多,例如:大顶堆,小顶堆&#xff0c;斐波那契堆&#xff0c;左偏堆&#xff0c;斜堆等等。从子结点个数上可以分为二汊堆&#xff0c;N叉堆等等。本文将介绍的是二叉堆。 二叉堆的概念 1、引例 我们小时候&#xff0c;基…

04 MIT线性代数-矩阵的LU分解 Factorization into A=LU

目的: 从矩阵的角度理解高斯消元法, 完成LU分解得到ALU 1.矩阵乘积的逆矩阵 Inverse of a product 2.矩阵乘积的转置 Transpose of a product 3.转置矩阵的逆矩阵 Inverse of a transpose 4.矩阵的LU分解 U为上三角阵(Upper triangular matrix), L为下三角阵(Lower triangular…

【C++ 学习 ㉘】- 详解 C++11 的列表初始化

目录 一、C11 简介 二、列表初始化 2.1 - 统一初始化 2.2 - 列表初始化的使用细节 2.2.1 - 聚合类型的定义 2.2.2 - 注意事项 2.3 - initializer_list 2.3.1 - 基本使用 2.3.2 - 源码剖析 一、C11 简介 1998 年&#xff0c;C 标准委员会发布了第一版 C 标准&#xff0…

大数据Hadoop之——部署hadoop+hive+Mysql环境(window11)

一、安装JDK8 【温馨提示】对应后面安装的hadoop和hive版本&#xff0c;这里使用jdk8&#xff0c;这里不要用其他jdk了&#xff0c;可能会出现一些其他问题。 1&#xff09;JDK下载地址 Java Downloads | Oracle 按正常下载是需要先登录的&#xff0c;这里提供一个不用登录下载…

VMware虚拟机安装Linux系统的介绍

许多新手连 Windows 的安装都不太熟悉&#xff0c;更别提 Linux 的安装了&#xff1b;即使安装成功了&#xff0c;也有可能破坏现有的 Windows 系统&#xff0c;比如导致硬盘数据丢失、Windows 无法开机等。所以一直以来&#xff0c;安装 Linux 系统都是初学者的噩梦。 然而&a…

Zookeeper【Curator客户端Java版】从0到1——万字学习笔记

目录 初识Zookeeper Zookeeper作用 维护配置信息 分布式锁服务 集群管理 生产分布式唯一ID Zookeeper的设计目标 Zookeeper 工作机制 数据模型 ZooKeeper 命令操作 服务端常用命令 客户端常用命令 ZooKeeper JavaAPI操作 Curator 介绍 Curator API 常用操作 导入依赖 建立连接 …

PTE-精听学习(一)

目录 SST SST每一题都是单独计时 MMA 切换题目的时候&#xff0c;总是会迷茫 deduct 出现关键词之后&#xff0c;才开始精听 没有人管你 &#xff0c;绝对是要为后方留出更多的时间 &#xff0c;选多一个错的&#xff0c;要倒扣分 特征 1.paraphrase 2.循序出现 …

JDK 21的新特性总结和分析

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Windows服务器安装php+mysql环境的经验分享

php mysql环境 下载IIS Php Mysql环境集成包,集成包下载地址: 1、Windows Server 2008 一键安装Web环境包 x64 适用64位操作系统服务器:下载地址:链接: https://pan.baidu.com/s/1MMOOLGll4D7Eb5tBrdTQZw 提取码: btnx 2、Windows Server 2008 一键安装Web环境包 32 适…

视频推拉流/直播点播平台EasyDSS分享的链接提示“无信号”,该如何解决?

视频直播点播平台EasyDSS可支持用户自行上传视频文件&#xff0c;也可将上传的点播文件作为虚拟直播进行播放。平台能支持多屏播放&#xff0c;可兼容Windows、Android、iOS、Mac等操作系统&#xff0c;还能支持CDN转推&#xff0c;具备较强的可拓展性与灵活性。 为给用户提供更…

AcWing算法提高课-5.6.2青蛙的约会

宣传一下 算法提高课整理 CSDN个人主页&#xff1a;更好的阅读体验 原题链接 题目描述 两只青蛙在网上相识了&#xff0c;它们聊得很开心&#xff0c;于是觉得很有必要见一面。 它们很高兴地发现它们住在同一条纬度线上&#xff0c;于是它们约定各自朝西跳&#xff0c;直到…

数据库设计与前端框架

数据库设计与前端框架 学习目标&#xff1a; 理解多租户的数据库设计方案 熟练使用PowerDesigner构建数据库模型理解前端工程的基本架构和执行流程 完成前端工程企业模块开发 多租户SaaS平台的数据库方案 多租户是什么 多租户技术&#xff08;Multi-TenancyTechnology&a…

PCI设备与UIO驱动

随着网络的高速发展,对网络的性能要求也越来越高,DPDK框架是目前的一种加速网络IO的解决方案之一,也是最为流行的一套方案。DPDK通过bypass内核协议栈与内核驱动,将驱动的工作从内核态移至用户态,并利用polling mode的线程工作模式加速网络I/O使得网络IO性能出现大幅度的增…