2016-12-28 22 views
1

Jsonを解析するエンドポイントを持つJavaサーバーアプリケーションがあります。 JSONファイルが大きい場合 私はCapricious JsonのJava解析エラー

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

ファイルは、次のように解析され、リーダを作成

InputStream in = httpExchange.getRequestBody(); 
JsonReader reader = Json.createReader(in); 

は、随時例外をスローし、このようにWgetに要求を行う(約10,000行)しかし、同じファイルに対しては時々成功します。エラーメッセージは次のようになります。

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

ファイル内のその行に移動すると、正常に表示されます。私はまた、ファイルの先頭に 'var a ='を追加するだけでJavascriptでファイルを解析しようとしましたが、それは問題ありません。私はファイルを分割することを試みましたが、内容にかかわらずファイルが小さくなるにつれて、それが成功することがあることに気付きました...

wgetが完全に投稿する前にJavaがファイルをストリーミングすることができますか?そんなに奇妙な?そして、パーサは...時期尚早のEOFか何かを見ている

クルーレス:(

編集:

私は、この機能で、最初の文字列にファイルを保存した

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

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

NetBeansを使用して、私はJsonReaderの作成をこれで置き換えましたファイルへのreqBodyStringの値とファイルが途中で終了します。私は体全体を取得していないようです...何かがあまりにも迅速にストリームを閉じている必要があります...?サーバがまだストリームを読み出している間:(

+0

スタックトレースをポストできますか? – PeterMmm

+0

スタックトレースはそれほど興味深いわけではありませんが、ここではMyHandler.fail:25 \t MyHandlerです。ハンドル:79 \t AuthFilter.doFilter:83 \t フィルターの$ Chain.doFilter:82 \t ServerImpl $所$ LinkHandler.handle:675 \t フィルター$チェーン83 \t 隠しソースが\t フィルタの$ Chain.doFilterを呼び出します。 doFilter:79 \t ServerImpl $ Exchange.run:647 \t ThreadPoolExecutor.runWorker:1142 \t ThreadPoolExecutor $ Worker.run:617 \t Thread.run:745 – endavid

+0

たぶんCHARSETエラー... –

答えて

0

エラーがあまりにも早く接続を終え、クライアントによって引き起こされた。

のHttpExchange FixedLengthInputStreamを返します。デバッガでは、私は、「残りの」ストリームのプライベートメンバーを見ることができましたどうやらそれは読み終えたにもかかわらず、まだ+ 100キロバイトだった。参考のため、ここでは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);     
     } 

Thがクライアントの電子ソリューションは

wget --timeout=30 ... 

、タイムアウトを増やすことであろうが、これは、Windows、

> wget64 --version 
GNU Wget 1.17.1 built on mingw32. 

ためのwgetで動作するようには思えない私はcygwinの上でwgetコマンドをインストールし、その1でも動作しますタイムアウトパラメータなしで

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