jsonarray怎么截取数据?
你好,可以使用JSONArray的get方法来获取指定位置的数据,具体的操作如下所示:
```java
JSONArray jsonArray = new JSONArray("[1, 2, 3, 4, 5]");
// 获取索引为2的数据
int data = jsonArray.getInt(2);
System.out.println(data); // 输出:3
// 获取索引为1到3的数据
JSONArray subArray = jsonArray.getJSONArray(1, 4);
System.out.println(subArray); // 输出:[2, 3, 4]
```
在上述代码中,我们创建了一个JSONArray对象,然后使用getInt方法获取索引为2的数据(即第3个元素),并打印出来。接着使用getJSONArray方法获取索引为1到3的数据,并将其存储在新的JSONArray对象中,最后再将该子数组打印出来。
要截取JSON数组中的数据,可以使用JSONArray类的subList方法。首先,将JSON数组转换为Java的List对象,然后使用subList方法指定起始索引和结束索引来截取数据。
这将返回一个新的List对象,其中包含指定范围内的元素。
最后,可以将截取后的数据再转换为JSON数组,如果需要的话。这样就可以实现对JSON数组的数据截取操作。
如何优化很长的JSON数据?
现在主流的网络请求中都采用JSON作为其数据交互格式,这主要是因为JSON有以下优势:
数据格式简单,易于读写,格式都是压缩的,占用带宽小;
易于解析,客户端JS很容易JSON数据进行解析和编辑;
支持大多数后端语言,大大简化了服务端和前端交互时的代码开发量,且易于维护;
但如果在开发过程中,把很长很大的JSON数据在前后端传输,那就说明设计工作没做好,应该尽量避免这种数据传输,但也可以从下面几个方面进行下优化:
优化json数据的key-value的长度,尽量简洁易懂即可;
异步分批加载,建设大数据量造成前端页面卡死;
前端增加销毁机制,可以一边加载,一边销毁;
使用解析和压缩性能高的JSON解析工具;
在 Skylake 处理器上,各种解析器解析同一个大数据量的JSON文件的速度(以 GB/s 为单位)如下所示:
作为JSON这个规范,要在大小上优化,空间很有限,所获得的收益也很低,但是也不是没有优化空间,可以从下面几个角度入手:
1.优化传输大小,打开服务器的gzip压缩即可,但会略微占用更多CPU。
2.使用更短的key,为了可读性,一般不建议这么做。
3.开启重复引用和循环引用。Java实现的一些JSON库支持重复和循环引用,可以缩小JSON文本大小。比如在传输的数据中出现相同的对象时,fastjson默认开启引用检测将相同的对象写成引用{"$ref":".."}的形式.
如图所示:
对于第二个LoanOrder 02,fastjson仅仅解析并加载其贷款订单部分的数据,对于“$ref”所指向的 Loaner贷款人的数据,fastjson会因为“开启了fastJson的‘循环引用检测’机制”而不去加载该贷款人数据。
这样可以大大减少重复对象的处理,但是问题是大部分JSON库包括浏览器客户端并不支持这个特性。
4.如果又要体积小,又要兼容性好,建议使用体积更小的序列化方式,比如msgpack.
MessagePack is an efficient binary serialization format. It lets you exchange data among multiple languages like JSON. But it's faster and smaller.
不仅体积小,而且速度快,比JSON快多了。
下面是JSON、Protobuf、Thrift、MessagePack 序列化大小对比,体积都比JSON要小。

