Jackson Fehlermeldung "ungültiges Zeichen... nur reguläre Leerzeichen erlaubt" beim Parsen des JSON
Ich versuche zum abrufen von JSON-Daten aus einer URL bekomme aber die folgende Fehlermeldung:
Illegal character ((CTRL-CHAR, code 31)):
only regular white space (\r, \n,\t) is allowed between tokens
Mein 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
Die url gebaut ist ich.e https://www.example.org/api/search.json?keywords=iphone&count=50
Was läuft hier falsch? Und wie kann ich analysieren diese Daten erfolgreich?
Importe:
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;
Beispiel Antwort
{
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"
}
]
}
}
- könnte, fügen Sie die JSON-Rückgabe durch URL-analysiert werden?
- Nur ein Hinweis: Bitte verwenden Sie immer
example.org
oderexample.com
zum Beispiel domain-Namen. Wenn Sie eine Domäne ist, wird möglicherweise Probleme verursachen für jeden, der passiert, um es zu besitzen. Siehe example.com auf Wikipedia. - emaple Antwort Hinzugefügt
- Das problem ist wahrscheinlich eine unsichtbare Zeichen in der Antwort. Könntest du ein hexdump der Antwort? Zum Beispiel auf Linux oder mit cygwin auf Windows ausführen:
curl http://example.org/my-rest-url |hexdump -C
. - Hi @sleske, ich rollte die URL und eine Antwort erhalten...dann Lauf ich die JSON-durch JSLint und get 'Gültiges JSON'
- Nun, wie spielt das eine Rolle? JSLint ist für die überprüfung JavsScript nicht für JSON. Die beiden sind Verschieden (obwohl Sie ähnlich Aussehen). Jedenfalls, einige checking-tools können toleranter sein, als Jackson, also auch, wenn ein checker findet die JSON-ok, das mag nicht. Also, postet bitte den hexdump als ich schrieb, sonst bekommen wir nichts...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Botschaft sollte ziemlich selbsterklärend:
Es ist ein unzulässiges Zeichen (in diesem Fall Zeichen-code 31 an, d.h. der control-code "Unit Separator") in der JSON-Verarbeitung.
In anderen Worten, die Daten, die Sie empfangen, ist nicht die richtige JSON.
Hintergrund:
JSON spec (RFC 7159) sagt:
In anderen Worten: JSON enthalten können whitespaces zwischen Token ("Token", also den Teil des JSON, d.h. Listen, strings usw.), aber "Leerzeichen" definiert ist, nur bedeuten die Zeichen Leerzeichen, Tabulator, Zeilenvorschub und Wagenrücklauf.
Enthält das Dokument etwas anderes (code 31), wo nur whitespace ist erlaubt, damit ist kein gültiges JSON.
Analysieren diese:
Leider die Jackson-Bibliothek, die Sie verwenden nicht bieten einen Weg, um zu analysieren, diese fehlerhaften Daten. Zu analysieren ist dies erfolgreich, haben Sie, um filter, JSON, bevor es verarbeitet wird von Jackson.
Werden Sie wahrscheinlich haben, zum abrufen der (pseudo-)JSON, sich von der REST-service über den standard-HTTP verwenden, z.B. java.net.HttpUrlConnection. Dann entsprechend filtern "schlechte" Zeichen, und übergeben Sie die resultierende Zeichenfolge nach Jackson. Wie dies genau sind, hängt, wie Sie Jackson.
Fühlen Sie sich frei, zu Fragen, eine separate Fragen, wenn Sie Schwierigkeiten haben :-).
Ich habe das gleiche Problem, und ich fand, dass es verursacht wurde durch die
Content-Encoding: gzip
header. Die client-Anwendung (wo die exception wurde geworfen) war nicht in der Lage zu handhaben, content-encoding. FWIW die client-Anwendung wurde mitio.github.openfeign:feign-core:9.5.0
, und diese Bibliothek wird um einige Themen rund um Kompression (link).Könnten Sie versuchen, hinzufügen der header
Accept-Encoding: identity
auf Ihre Anfrage, jedoch nicht alle web-Server/web-Anwendungen richtig konfiguriert sind, und einige scheinen Missachtung dieser header. Sehen diese Frage für mehr details darüber, wie zu verhindern, dass gzipped-Inhalt.Ich hatte das gleiche problem. Nach der Einstellung Gzip-es wurde behoben. Bitte meinen code
Hatte ich ein ähnliches Problem. Nach einigen Recherchen fand ich, dass restTemplate verwendet die SimpleClientHttpRequestFactory der keine Unterstützung für gzip-Codierung. Zum aktivieren der gzip-Codierung für Ihre Antwort, müssen Sie einen neuen Antrag Fabrik für den rest template-Objekt - HttpComponentsClientHttpRequestFactory.
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());