如何确定InputStream是否包含JSON数据?

时间:2015-01-14 09:08:17

标签: java json unicode utf-8 inputstream

如何检查java.io.InputStream(来自FileURL,..)背后的数据是否为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;
}

直到现在我的机器还没有燃烧,但是:

  • 这种方法/实施有什么问题吗?
  • 在某些情况下可能有任何问题吗?
  • 有什么需要改进的吗?

1 个答案:

答案 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文本可以忽略字节顺序标记的存在   而不是将其视为错误。

这并没有回答你的问题,但我希望它可以帮助你的逻辑。