2017-03-06 5 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

emaple response added – 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을 Jackson이 처리하기 전에 필터링해야합니다.

표준 HTTP를 사용하여 REST 서비스에서 (pseudo) JSON을 직접 검색해야합니다. java.net.HttpUrlConnection. 그런 다음 적절하게 "나쁜"문자를 걸러 내고 결과 문자열을 Jackson으로 전달하십시오. 이 작업을 수행하는 방법은 Jackson 사용 방법에 따라 다릅니다.

문제가 있으면 별도로 질문하십시오 .--).

+0

응답 건배 ... 내 말은 JSON을 제어하지 못합니다. 그의 주위에 방법이 있습니까 ... 내가 URL을 쳤을 때 브라우저에서 응답을 얻으므로 ObjectMapper를 덜 엄격하게 만드는 방법이 있습니까 ??? – rogger2016

+1

@ rogger2016 : 그건 다른 질문입니다 :-). 나는 나의 대답을 확장하려고 노력할 것이다. – sleske

+0

http://sackoverflow.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을 추가 할 수도 있지만 모든 웹 서버/웹 응용 프로그램이 올바르게 구성되어 있지는 않으며 일부는이 헤더를 무시하는 것처럼 보입니다. gzip으로 압축 된 내용을 방지하는 방법에 대한 자세한 내용은 this question을 참조하십시오.