如何检查java.io.InputStream
(来自File
,URL
,..)背后的数据是否为JSON类型?
当然,要完成最好的方法是加载流的整个数据并尝试将其验证为JSON(例如检查右括号}
)。由于流源可能非常大(一个大小为500MB的GeoJSON文件),这最终会在一台刻录机中结束。
为了避免这种情况,我写了一个小方法,只将InputStream
的第一个字符作为UTF-8/16/32,并根据RFC 4627测试它是{
(由RFC 7159引用和更新)以确定其JSONness:
JSON文本应以Unicode编码。默认编码为UTF-8。
和
由于JSON文本的前两个字符始终为ASCII 字符[RFC0020],可以确定是否为八位字节 通过查看,流是UTF-8,UTF-16(BE或LE)或UTF-32(BE或LE) 在前四个八位字节中的空值模式。
00 00 00 xx UTF-32BE
00 xx 00 xx UTF-16BE
xx 00 00 00 UTF-32LE
xx 00 xx 00 UTF-16LE
xx xx xx xx UTF-8
方法是:
public static boolean mightBeJSON(InputStream stream) {
try {
byte[] bytes = new byte[1];
stream.read(bytes);
if (bytes[0] == 0x7B) {
return true;
}
stream.read(bytes);
if (bytes[0] == 0x7B) {
return true;
}
stream.read(bytes);
stream.read(bytes);
if (bytes[0] == 0x7B) {
return true;
}
} catch (IOException e) {
// Nothing to do;
}
return false;
}
直到现在我的机器还没有燃烧,但是:
答案 0 :(得分:1)
RFC 7159州:
<强> 8。字符串和字符问题
8.1字符编码
JSON文本 SHALL 以UTF-8,UTF-16或UTF-32编码。该 默认编码是UTF-8,以及以UTF-8编码的JSON文本 在它们将被成功读取的意义上是可互操作的 最大数量的实现;有很多实现 无法成功读取其他编码中的文本(例如UTF-16) 和UTF-32)。
实现绝不能在字母序列开头添加字节顺序标记 一个JSON文本。为了互操作性,实现 解析JSON文本可以忽略字节顺序标记的存在 而不是将其视为错误。
这并没有回答你的问题,但我希望它可以帮助你的逻辑。