Java 中反复无常的 Json 解析错误

Capricious Json parsing errors in Java

我有一个 Java 服务器应用程序,其端点解析 Json。 我像这样用 Wget 发出请求,

wget --header="Content-Type: application/json" --post-file=somefile.json %SERVER_URL%

文件是这样解析的,

InputStream in = httpExchange.getRequestBody();
JsonReader reader = Json.createReader(in);
当 json 文件很大(大约 10,000 行)时,

Create reader 有时会抛出异常,但它有时会成功地处理同一个文件。错误消息如下所示,

Unexpected char -1 at (line no=4029, column no=228, offset=204873)

如果我转到文件中的那一行,它看起来不错。我还尝试在 Java 脚本中解析文件,只需将 'var a = ' 添加到文件的开头,就可以了。我试过将文件一分为二,但后来我意识到它有时会成功,因为文件变小了,不管内容如何...

会不会是 Java 在 wget 完全发布文件之前开始流式传输文件或类似的奇怪的东西?解析器看到过早的 EOF 或其他东西......

一窍不通:(

编辑:

我先把文件保存到一个字符串中,用这个函数,

static String convertStreamToString(java.io.InputStream is) {
    java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\A");
    return s.hasNext() ? s.next() : "";
}

然后我用这个替换了JsonReader的创作,

InputStream in = he.getRequestBody();
String reqBodyString = convertStreamToString(in);
JsonReader reader = Json.createReader(new StringReader(reqBodyString));

使用 NetBeans,我将 reqBodyString 的值保存到文件中,但文件过早结束。看来我没有得到全部 body...一定是某些东西关闭得太快了...? :(

错误是由于客户端结束连接太快而服务器仍在读取流造成的。

HttpExchange returns 固定长度输入流。在调试器中,我可以看到流的私有成员 "remaining" 仍然是 +100KB,尽管它显然已经完成读取。作为参考,这里是 FixedLengthInputStream 的实现。

我已将此消息添加到服务器,

        try{
            JsonReader reader = Json.createReader(in);
            // ... do stuff
        }
        catch(JsonParsingException exception) {
            String msg = "JsonParsingException: " + exception.getLocalizedMessage();
            msg += " (could be caused by a premature EOF if the client timed out too quickly)";
            logMessage(msg);                
        }

客户端的解决方案是增加超时,[​​=15=]

wget --timeout=30 ...

然而,这在 Windows、

的 wget 中似乎不起作用
> wget64 --version
GNU Wget 1.17.1 built on mingw32.

我在 cygwin 上安装了 wget,即使没有超时参数也能正常工作,

$ wget --version
GNU Wget 1.18 built on cygwin.