JSON入力の予期しない終了



Unexpected End Json Input



ビジネスロジックは次のとおりです。

1、フロントエンドajaxはバックグラウンドコントローラーメソッドを呼び出し、コントローラーは外部httpインターフェイスを呼び出し、HttpURLConnectionオブジェクトの呼び出しメソッドをカプセル化します。現在、ピアインターフェイスは完了していないため、ローカルオーサリングインターフェイスはhttpリクエスト処理を受信して​​戻ります。フロントページは常に次のように報告します。



SyntaxError: Unexpected end of JSON input at parse () at Ut (jquery-3.3.1.min.js:2) at k (jquery-3.3.1.min.js:2) at XMLHttpRequest. (jquery-3.3.1.min.js:2) at Object.send (jquery-3.3.1.min.js:2) at Function.ajax (jquery-3.3.1.min.js:2) at findWorkOrderInfo (initGroup.action?userId=402880e92db726b5012db729f65f0001&groupId=403880e92db726b5012db729f65f0002&chatId=297e60f264f472170164f501db7d038e:66) at HTMLImageElement.onclick (initGroup.action?userId=402880e92db726b5012db729f65f0001&groupId=403880e92db726b5012db729f65f0002&chatId=297e60f264f472170164f501db7d038e:135)

フロントエンドコードはおおまかに次のとおりです。

$.ajax({ url : url, data : data, dataType : 'json', type : 'POST', async:false, success : function(obj) { }, error:function(data,type,err){ console.log(data) console.log(type) console.log(err) } })

何度も確認してみれば問題ありませんが、基本的にはバックグラウンドでデータが返されていると判断できます。



1.デバッガーのバックグラウンドコードを開始します。まず、エラーによると、スプライシングのjson文字列がフォーマットに準拠していません。したがって、結果の文字列がコピーされてreturnステートメントでチェックされ、問題は見つかりません。

2、コードがコメントアウトされ、json文字列を返すステートメントのみが結果を直接返し、フロントエンドページが正しく解析されるため、処理ロジックに問題があると思われます。

3、問題は主に、データ部分を返し、コードのこの部分をコメントアウトし、修正された結果を返し、フロントエンドが正しく解析される外部インターフェイスの呼び出しに焦点を当てているため、呼び出しインターフェイスの問題を特定します。



4、エラーはJSON入力の予期しない終了であるため、それがリクエストヘッダー設定の問題であるかどうかを疑ってください。ただし、外部インターフェイスをリクエストするときに設定されるContent-Typeは、実際にはapplication / json charset = UTF-8であり、カプセル化されたもののチェックを開始します。インターフェイス呼び出しメソッドステップバイステップでテストをコメントアウトして、問題を特定します。 HttpURLConnectionオブジェクトは、getInputStream()メソッドを呼び出します。このメソッドは実際にはリクエストを送信するためのメソッドであるため、リクエストオブジェクトまたはレスポンスオブジェクトに問題があるのか​​どうか疑問に思い始めます。

5、テストインターフェイスがresponse.getWriter()。println()メソッドを使用して結果を返したため、文字列が返され、デバッグでは問題なく返された結果が表示されます。応答オブジェクトの一部のプロパティに問題があるかどうかを疑ってから、外部インターフェイスの応答オブジェクトを、デバッグプロセスでajaxと呼ばれるコントローラーメソッドの応答と誤って比較し、応答オブジェクトのIDが同じであることを確認します。 。 。 。この問題は基本的に発見されました。外部インターフェイスを呼び出すときに応答オブジェクトを使用し、応答が返されるため、要求は応答にのみ対応できます。つまり、応答オブジェクトは1回しか使用できません。 ajaxと応答を使用します。オブジェクトが故障しています。次に、私が作成したテストインターフェイスとajaxによって呼び出されたメソッドがコントローラークラスにあることがわかりました。これにより、同じ応答オブジェクトが使用されます。

6、ここで問題は基本的に明らかです。テストインターフェイスは新しいコントローラークラスに書き込まれるため、外部インターフェイスがバックグラウンドで再度呼び出された場合、ajax呼び出しメソッドと外部インターフェイスはコントローラークラスにありません。新しい応答オブジェクトを使用します。 、結果を取得し、元の応答オブジェクトを介して結果をフロントエンドに返すと、テストは成功します。 。 。

ここにもあなた自身の落とし穴があり、後でピアインターフェイスが完成していません。テストするインターフェイスを作成するときは、怠惰にならないように注意してください。呼び出し元はクラスで作成され、おそらく2つの呼び出しで同じ応答を使用します。検出できないエラーが発生します。 。 。