JSON 字符串数据大小平台无关

Posted

技术标签:

【中文标题】JSON 字符串数据大小平台无关【英文标题】:JSON String datasize platform independant 【发布时间】:2018-03-12 09:23:21 【问题描述】:

我想使用 Java 确定 JSON Java 字符串的数据大小(以字节为单位)。 此计算应该与平台无关,因为该软件用于不同的系统和(可能)不同的默认字符编码(Windows、Linux、zOS...)。 JSON 应该只包含可以使用 UTF-8 编码的字符。到目前为止,在所有用例中,只有字符可以用 1 个字节编码,但是,将来,汉字,例如??? (U+20F2E),也被使用了。

这里有没有一种以稳健的方式计算数据大小的最佳实践方法?

据我了解,json.getBytes("UTF-8").length 似乎是一个有效的解决方案。

在 Windows 上测试输出:

这是一个 1Byte UTF-8 字符:

@
"@".length() -> 1
"@".getBytes().length -> 1
"@".getBytes("UTF-8").length -> 1
new String("@".getBytes("UTF-8")) -> @
"@".getBytes("UTF-16").length -> 4
new String("@".getBytes("UTF-16")) -> ��

这是一个 2Byte UTF-8 字符:

µ
"µ".length() -> 1
"µ".getBytes().length -> 2
"µ".getBytes("UTF-8").length -> 2
new String("µ".getBytes("UTF-8")) -> µ
"µ".getBytes("UTF-16").length -> 4
new String("µ".getBytes("UTF-16")) -> ��

这是一个 4Byte UTF-8 字符:

????
"????".length() -> 2
"????".getBytes().length -> 4
"????".getBytes("UTF-8").length -> 4
new String("????".getBytes("UTF-8")) -> ????
"????".getBytes("UTF-16").length -> 6
new String("????".getBytes("UTF-16")) -> ���c��

编辑: 应该计算“压缩”JSON 的长度,即没有任何不必要的空格(来自漂亮的打印)。

【问题讨论】:

What is the Java's internal represention for String? Modified UTF-8? UTF-16?的可能重复 JSON 允许对一个字符和无意义的空格进行多种表示,那么 JSON 文档的长度是什么意思呢? � 是程序员错误处理文本并丢失部分文本的用户标记。 @TomBlodget:在这种情况下,我们想要压缩 JSON 的长度,即没有所有不必要的空格 【参考方案1】:

如果您的 JSON 可用作所有空格都被修剪的字符串,String.getBytes(String charsetName).length 应该会为您提供正确的大小。

请注意,在 JVM 内存中,字符串将以 UTF-16 编码,一旦写入文件或数据库,它就会使用不同的编码(UTF-8、8859-1...),因此具有不同的大小。

【讨论】:

以上是关于JSON 字符串数据大小平台无关的主要内容,如果未能解决你的问题,请参考以下文章

JSON基础知识

js中带 其他无关字符的长字符串转标准json对象

js中带 其他无关字符的长字符串转标准json对象

JSONAJAXJSONPXML

Qt平台下使用QJson解析和构建JSON字符串

Qt平台下使用QJson解析和构建JSON字符串