org.codehaus.jackson.JsonParseException: Ungültige UTF-8-middle-byte 0xdf
Bin ich mit dem jackson-framework für das Marshalling und unmarshalling der Daten zwischen JSON und Java. Alles funktioniert gut, solange die Eingabe nicht beliebige Zeichen enthalten, wie:
- ö
- ä
- ü
- Ö
- Ä
- Ü
- ß
Für die Eingabe der Daten habe ich versucht:
String jsonData = "{\"id\":1,\"street\":\"Straße\",\"number\":\"1c\",\"zipCode\":1111,\"city\":\"MyCity\"}";
sowie:
String jsonData = "{\"id\":1,\"street\":\"Stra\u00DFe\",\"number\":\"1c\",\"zipCode\":1111,\"city\":\"MyCity\"}";
die ganze Zeit, bekomme ich die gleiche exception.
Das mapping von json-Daten an java-entity-Objekt erfolgt über:
/*
* Convert stream to data entity
*/
ObjectMapper m = new ObjectMapper();
T entity = (T) m.readValue(stringToStream(jsonData), readableClass);
Ich auch eine json-Daten Validierung, die funktioniert wie erwartet, auch mit den oben genannten chars.
Wie sollten solche Daten gehandhabt werden?
UPDATE
Dies sind die wichtigen Teile des MessageBodyReader
Klasse
@Override
public T readFrom(Class<T> type, Type genericType,
Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, String> httpHeaders, InputStream entityStream)
throws IOException, WebApplicationException {
final String jsonData = getStringFromInputStream(entityStream);
System.out.println(jsonData);
InputStream isSchema = new FileInputStream(jsonSchemaFile);
String jsonSchema = getStringFromInputStream(isSchema);
/*
* Perform JSON data validation against schema
*/
validateJsonData(jsonSchema, jsonData);
/*
* Convert stream to data entity
*/
ObjectMapper m = new ObjectMapper();
T entity = (T) m.readValue(stringToStream(jsonData), readableClass);
return entity;
}
/**
* Validate the given JSON data against the given JSON schema
*
* @param jsonSchema
* as String
* @param jsonData
* as String
* @throws MessageBodyReaderValidationException
* in case of an error during validation process
*/
private void validateJsonData(final String jsonSchema, final String jsonData)
throws MessageBodyReaderValidationException {
try {
final JsonNode d = JsonLoader.fromString(jsonData);
final JsonNode s = JsonLoader.fromString(jsonSchema);
final JsonSchemaFactory factory = JsonSchemaFactory.byDefault();
JsonValidator v = factory.getValidator();
ProcessingReport report = v.validate(s, d);
System.out.println(report);
if (!report.toString().contains("success")) {
throw new MessageBodyReaderValidationException(
report.toString());
}
} catch (IOException e) {
throw new MessageBodyReaderValidationException(
"Failed to validate json data", e);
} catch (ProcessingException e) {
throw new MessageBodyReaderValidationException(
"Failed to validate json data", e);
}
}
/**
* Taken from <a href=
* "http://www.mkyong.com/java/how-to-convert-inputstream-to-string-in-java/"
* >www.mkyong.com</a>
*
* @param is
* {@link InputStream}
* @return Stream content as String
*/
private String getStringFromInputStream(InputStream is) {
BufferedReader br = null;
StringBuilder sb = new StringBuilder();
String line;
try {
br = new BufferedReader(new InputStreamReader(is));
while ((line = br.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sb.toString();
}
private InputStream stringToStream(final String str) {
return new ByteArrayInputStream(str.getBytes());
}
- Könnten Sie bitte übermitteln Sie uns auch stringToStream code?
- Quelle Hinzugefügt, thx
- Möglich, Duplikat der jackson JsonParseException: Ungültige UTF-8-middle-byte
Du musst angemeldet sein, um einen Kommentar abzugeben.
JSON-Spezifikation besagt, dass nur gültige Kodierungen sind UTF-8, UTF-16 und UTF-32. Keine andere Kodierungen (wie Latin-1) verwendet werden kann. Ihre stringToStream Umsetzung ist die Einstellung nicht die Kodierung explizit, also system-Standardwert benutzt. Das ist, wie Sie nicht-utf-stream. Im nächsten Schritt Jakson versucht zu analysieren stream mit einer UTF-Codierungen (es hat Erkennungsalgorithmus integriert) - und scheitert. Versuchen Sie, eine explizite Codierung:
Haben Sie schon eine Antwort, aber eine offensichtliche Frage hier ist: warum sind Sie konvertieren aus einer
String
zu einem stream??? Das ist unnötig und verschwenderisch, was zu tun -- so einfach übergeben Sie die Zeichenfolge wird als-ist. Dies wird auch entfernen, das problem; Strings müssen nicht die Kodierung per se (das heißt: es gibt nur einen einzigen in-memory-Darstellung und keine Umwandlungen erforderlich sind).T entity = (T) m.readValue(jsonData, readableClass);
gibt es weitere Verbesserungen?InputStreamReader
, Anhängen mitStringBuilder
anstelle von line-by-line. Oder, wenn JSON-Schema-Validator können LesenReader
oderInputStream
, passieren die -- es kann gut sein, mit Jackson unter der Haube als auch.