0

以下の私のコードは、JavaのURLConnectionを使用して、JSON文字列を返すRESTfulAPIにpingを実行しています。返されるJSON文字列は完全に有効であるように見えますが、JSONLintと以下のコードの最終行の両方で失敗します。

返されるJSONは次のとおりです。

{"rowId": "1-12C-1494"}

エラーメッセージは次のとおりです。

2行目の解析エラー:... rowId ":" 1-12C-1494 "----------------------- ^'}'、'を期待しています: '、'、'、'] '

コードは次のとおりです。

StringBuilder responseBuilder = new StringBuilder();

URLConnection connection = url.openConnection();
InputStream cin = connection.getInputStream();
int bytesRead = -1;
byte[] buffer = new byte[1024];

while ((bytesRead = cin.read(buffer)) >= 0) {
    responseBuilder.append(new String(buffer, "UTF-8"));
}

String response = responseBuilder.toString();

JsonObject jsonObject = new JsonParser().parse(response).getAsJsonObject();

ブラウザからRESTfulAPIにpingを実行し、そこにあるJSONをJSONLintにコピーすると、正常に検証されます。私がこれを伝えることができる最善の方法は、ある種の文字/空白のエンコーディングの問題です。他の誰かがそれに遭遇し、何かガイダンスがありますか?ありがとう!

4

1 に答える 1

1

さて、それは私がどのように Stream から String に移行したかに関係していました。上記の例のメソッドは、JSON の途中に ~1000 バイトのギャップを残しました。JSONLint はこれを、解釈もレンダリングもできない空白文字として扱いました。

話の教訓... InputStream から String に移動するために行った方法を使用しないでください。これははるかにうまく機能します:

InputStream cin = connection.getInputStream();

java.util.Scanner s = new java.util.Scanner(cin).useDelimiter("\\A");
(StringBuilder)responseBuilder.append(s.hasNext() ? s.next() : "");

説明については、InputStream を文字列に読み取る/変換するを参照してください。

于 2013-01-25T22:24:28.883 に答える