2017-03-06 2 views
2

Je suis en train de récupérer des données JSON à partir d'une URL, mais l'erreur suivante:erreur Jackson « caractère illégal ... seul espace blanc régulier a permis » lors de l'analyse JSON

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

Mon code:

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 

L'URL construite est https://www.example.org/api/search.json?keywords=iphone&count=50

Qu'est-ce qui ne va pas ici? Et comment puis-je analyser ces données avec succès?


Importations:

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; 

exemple de réponse

{ 
    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

pourriez-vous ajouter le JSON retourné par l'URL à analyser? – user1121883

+1

Juste une note: S'il vous plaît utilisez toujours 'example.org' ou' example.com' pour des exemples de noms de domaine. Si vous créez un domaine, vous risquez de créer des problèmes pour ceux qui en sont propriétaires. Voir [example.com sur Wikipedia] (https://en.wikipedia.org/wiki/Example.com). – sleske

+0

réponse d'emaple ajoutée – rogger2016

Répondre

2

Le message devrait être assez explicite:

Il y a un caractère illégal (dans ce code de caractère de cas 31 , c'est à dire le code de contrôle "Unit Separator") dans le JSON que vous traitez. En d'autres termes, les données que vous recevez ne sont pas correctes. JSON.


Contexte:

La spécification JSON (RFC 7159) dit:

  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

En d'autres termes: JSON peut contenir des espaces entre les jetons ("jetons" qui signifie la partie du JSON, c'est-à-dire des listes, des chaînes, etc.), mais "espace" est défini pour signifier seulement les caractères Espace, Tabulation, Retour à la ligne et Retour chariot.

Votre document contient autre chose (code 31) où seuls les espaces sont autorisés, par conséquent JSON n'est pas valide.


Pour analyser ceci:

Malheureusement, la bibliothèque Jackson que vous utilisez ne propose pas un moyen d'analyser ces données malformées. Pour analyser cela avec succès, vous devrez filtrer le JSON avant qu'il ne soit géré par Jackson.

Vous devrez probablement récupérer le (pseudo-) JSON vous-même à partir du service REST, en utilisant le protocole HTTP standard à l'aide, par ex. java.net.HttpUrlConnection. Puis filtrez correctement les "mauvais" caractères, et passez la chaîne résultante à Jackson. Comment faire cela dépend exactement de la façon dont vous utilisez Jackson.

N'hésitez pas à poser une question séparée si vous rencontrez des problèmes :-).

+0

Vive la réponse ... Je n'ai pas le contrôle du JSON, Y a-t-il un moyen de contourner son ... Quand je tape l'url dans le navigateur j'obtiens une réponse alors y a-t-il un moyen de rendre ObjectMapper moins strict ??? – rogger2016

+1

@ rogger2016: C'est une question différente :-). Je vais essayer d'élargir ma réponse. – sleske

+0

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

0

J'ai eu ce même problème, et j'ai trouvé qu'il était causé par l'en-tête Content-Encoding: gzip. L'application cliente (où l'exception était levée) n'était pas capable de gérer ce codage de contenu. FWIW l'application cliente utilisait io.github.openfeign:feign-core:9.5.0 et cette bibliothèque semble présenter des problèmes de compression (link).

Vous pouvez essayer d'ajouter l'en-tête Accept-Encoding: identity à votre demande, mais tous les serveurs Web/applications Web ne sont pas configurés correctement et certains semblent ignorer cet en-tête. Voir this question pour plus de détails sur la façon d'empêcher le contenu gzippé.