2016-04-15 2 views
2

Wird in einigen Fällen JSON-Zeichenfolge mit Jackson parsen.Unerwartetes Zeichen ('' (Code 92)) in Jackson

String jsonString = "{\"Age\":40, \"Name\":\"Sample User\"}"; 
ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(jsonString,JsonNode.class); 

System.out.println(jsonstirng) 
{"Age":40, "Name":"Sample User"} 

Above Code funktioniert gut, wenn ich jsonString Wert übergeben.

In einigen Fällen muss ich ungültige Zeichenfolge Zeichen zu entkommen wie ",' etc

zu entkommen Ich bin mit ApacheStringEscapeUtils.

String escapedString = StringEscapeUtils.escapeJson(jsonStirng); 

maskierten String Ausgabe

{\"Age\":40,\"Name\":\"Sample User\"} 

Als ich mapper seinen Wurf Unerwartetes Zeichen Ausnahme passieren escapedString.

ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(escapedString,JsonNode.class); 

Exception

Unexpected character ('\' (code 92)): was expecting double-quote to start field name 

bin eigentlich Protokolle ModSecurity Audit Parsen. Response-Body des Audit-Logs hat (html, css, javascript etc) Zeug, deshalb muss ich JSON-String zu entkommen andere weise es bricht das JSON-Format.

+0

Warum entgehen Sie den Anführungszeichen in dieser Zeichenfolge? Die echte Json-Zeichenfolge sollte keine Escape-Zeichen enthalten. Drucken Sie den 'jsonString', den Sie in Ihrer ersten Zeile haben, und Sie werden sehen, dass er intern nicht entwichen ist. – RealSkeptic

+0

Die Frage hat eine sehr verwirrende Beschreibung, es ist nicht einmal compilable und magisch entkommen ändert sich Alter von 40 bis 33. Bitte überprüfen und zeigen echten Code. Aber ich könnte nur annehmen, dass du etwas falsch zitierst. – kan

+0

@kan Tippfehler. Jetzt bin update es guck mal guck mal. –

Antwort

2

Der Zweck, einen String zu umgehen, ist, ihn als Stück von JSON zu entzweien.

In Ihrer Ursache ersetzen Sie alle " durch \", so dass es in einem String-Wert verwendet werden kann und der Parser wird es nicht als Teil des JSON sehen.

z.B. das ist nur ein Feld und Wert;

"myJson": "{\"Age\":40,\"Name\":\"Sample User\"}" 

was Sie nicht tun können, ist das Folgende, weshalb Sie diese Methode benötigen. Es kann nicht den Unterschied zwischen ", der die Zeichenfolge beginnt und endet, und " innerhalb der Zeichenfolge unterscheiden.

Wenn Sie dann versuchen, diese maskierte Zeichenfolge zu analysieren, sollte es nicht in der Lage sein, es zu analysieren.


EDIT: Hier ist ein Beispiel

String text = "{\"Age\":40,\"Name\":\"Sample User\"}"; 
String escaped = StringEscapeUtils.escapeJson(text); 
System.out.println("escaped= " + escaped); 
String unescaped = StringEscapeUtils.unescapeJson(escaped); 
System.out.println("unescaped= " + unescaped); 

druckt

escaped= {\"Age\":40,\"Name\":\"Sample User\"} 
unescaped= {"Age":40,"Name":"Sample User"} 

Sie können sehen, dass die maskierten String \" hat jedoch die unescaped Zeichenfolge nicht. Wenn Sie noch \ sehen, würde ich annehmen, dass der String nicht entkoppelt ist.

+0

Eigentlich Parsing ModSecurity Audit-Logs mit Jackson. Ich bekomme auch Antwort-Header und Response-Body. Response Body hat (html, css, javascript usw.) Zeug, deshalb muss ich json string entgehen, anderenfalls bricht das json Format. –

+0

@basitraza ist damit einverstanden, dass das Entkommen darin besteht, einen String sicher innerhalb eines Wertes zu platzieren. Um eine solche Zeichenfolge analysieren zu können, müssen Sie sie zuerst entschlüsseln, um sie umzukehren. Hinweis: Es gibt mehr als eine Möglichkeit, eine Zeichenfolge zu umgehen. Verwenden Sie daher am besten ein passendes Unescape –

+0

, was Sie in diesem Szenario empfehlen. Ich habe versucht verschiedene Fluchtmuster, aber nichts geändert. Escape-Zitat "" funktioniert in einigen Fällen, aber nicht in allen. –