2017-03-06 11 views
2

を解析するとき、私はURLからJSONデータを取得しますが、次のエラーを取得しようとしています:ジャクソンエラー「不正な文字...許可された唯一の定期的なホワイトスペース」JSON

Illegal character ((CTRL-CHAR, code 31)): 
only regular white space (\r, \n,\t) is allowed between tokens 

マイコード:

final URI uri = new URIBuilder(UrlConstants.SEARCH_URL) 
     .addParameter("keywords", searchTerm) 
     .addParameter("count", "50") 
     .build(); 
    node = new ObjectMapper().readTree(new URL(uri.toString())); <<<<< THROWS THE ERROR 
構築

urlがある。すなわちhttps://www.example.org/api/search.json?keywords=iphone&count=50

は間違ってここで何が起こっていますか?そして、このデータをどのようにして正常に解析できますか?


輸入:

import com.google.appengine.repackaged.org.codehaus.jackson.JsonNode; 
import com.google.appengine.repackaged.org.codehaus.jackson.map.ObjectMapper; 
import com.google.appengine.repackaged.org.codehaus.jackson.node.ArrayNode; 
import org.apache.http.client.utils.URIBuilder; 

例応答

{ 
    meta: { 
     indexAllowed: false 
    }, 
    products: { 
     products: [ 
      { 
       id: 1, 
       name: "Apple iPhone 6 16GB 4G LTE GSM Factory Unlocked" 
      }, 
      { 
       id: 2, 
       name: "Apple iPhone 7 8GB 4G LTE GSM Factory Unlocked" 
      } 
     ] 
    } 
} 
+1

パースされるURLによって返されたJSONを追加できますか? – user1121883

+1

ちょうど注記:ドメイン名の例としては、必ず 'example.org'または' example.com'を使用してください。ドメインを構成する場合は、ドメインを所有している人には問題が発生する可能性があります。 [example.com on Wikipedia](https://en.wikipedia.org/wiki/Example.com)を参照してください。 – sleske

+0

司会者の返信が追加されました – rogger2016

答えて

2

メッセージはかなり自明であるべきである。

不正な文字(この場合は文字コード31がありますつまり、コントロールコード "Unit Separator")を処理しているJSONに追加します。

つまり、受信したデータが適切なJSONではありません。


背景:

JSONの仕様(RFC 7159)はこう述べています。つまり

  1. JSON Grammar

A JSON text is a sequence of tokens. The set of tokens includes six tructural characters, strings, numbers, and three literal names.

[...]

Insignificant whitespace is allowed before or after any of the six structural characters.

ws = *(

%x20/ ; Space

%x09/ ; Horizontal tab

%x0A/ ; Line feed or New line

%x0D) ; Carriage return

を:JSONは、JSONの一部を意味するトークン( "トークン" の間に空白が含まれていてもよいですすなわち、リスト、文字列など)が含まれますが、 "空白"は空白、タブ、改行、および改行文字のみを意味すると定義されています。

文書に空白のみが許可されている他のもの(コード31)が含まれているため、有効なJSONではありません。


はこれを解析するには:

残念ながら、あなたが使用しているジャクソンのライブラリは、この不正な形式のデータを解析する方法を提供していません。これを正常に解析するには、ジャクソンが処理する前にJSONをフィルタ処理する必要があります。

RESTサービスから(疑似)JSONを取得する必要があります。 java.net.HttpUrlConnection。その後、適切に "悪い"文字をフィルタリングし、結果の文字列をJacksonに渡します。どのようにこれを行うに正確にどのようにジャクソンを使用するかによって異なります。

問題がある場合は別途質問してください.-)。

+0

応答のための乾杯...私はJSONをコントロールしていません。彼の周りに道がありますか?私はレスポンスを得るブラウザがあるので、ObjectMapperをそれほど厳密にする方法はありませんか? – rogger2016

+1

@ rogger2016:これは別の質問です:-)。私は私の答えを広げようとします。 – sleske

+0

http://stackoverflow.com/questions/42658481/code-31-where-only-whitespace-is-allowed-when-parsing-json-from-url-with-jacks @sleske – rogger2016

0

私はこの同じ問題を抱えており、それはContent-Encoding: gzipヘッダーによって引き起こされたことがわかりました。例外がスローされたクライアントアプリケーションは、このコンテンツエンコーディングを処理できませんでした。 FWIWクライアントアプリケーションがio.github.openfeign:feign-core:9.5.0を使用していたため、このライブラリには圧縮に関するいくつかの問題があるようです(link)。

あなたのリクエストにヘッダAccept-Encoding: identityを追加してみることもできますが、すべてのWebサーバ/ Webアプリケーションが正しく設定されているわけではなく、このヘッダを無視するようなものもあります。 gzipされたコンテンツを防止する方法の詳細については、this questionを参照してください。

関連する問題