3 Stimmen

ObjectMapper behandelt UTF-8 nicht richtig?

Ich verwende ObjectMapper, um Beiträge in meinem System in json zu serialisieren. Diese Beiträge enthalten Einträge aus der ganzen Welt und enthalten utf-8-Zeichen. Das Problem ist, dass der ObjectMapper diese Zeichen anscheinend nicht richtig verarbeitet. Zum Beispiel wird der String "Musée d'Orsay" als "Mus?©e d'Orsay" serialisiert.

Hier ist mein Code, der die Serialisierung durchführt:

public static String toJson(List posts) {
    ObjectMapper objectMapper = new ObjectMapper()
        .configure(Feature.USE_ANNOTATIONS, true);
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    try {
        objectMapper.writeValue(out, posts);
    } catch (JsonGenerationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (JsonMappingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return new String(out.toByteArray());
}

Interessanterweise wird die genau gleiche List posts ordnungsgemäß serialisiert, wenn ich sie über einen Anforderungs-Handler mit @ResponseBody zurückgebe und die folgende Konfiguration verwende:

public void configureMessageConverters(List> converters) {
    ObjectMapper m = new ObjectMapper()
        .enable(Feature.USE_ANNOTATIONS)
        .disable(Feature.FAIL_ON_UNKNOWN_PROPERTIES);
    MappingJacksonHttpMessageConverter c = new MappingJacksonHttpMessageConverter();
    c.setObjectMapper(m);
    converters.add(c);
    super.configureMessageConverters(converters);
}

Jede Hilfe ist sehr willkommen!

2voto

StaxMan Punkte 107669

Abgesehen von Konvertierungen, wie wäre es, den Prozess zu vereinfachen:

return objectMapper.writeValueAsString(posts);

was den Prozess beschleunigt (keine Notwendigkeit, von POJO zu Byte zu Array zu Dekodieren zu Zeichen zu String aufzubauen) und (was noch wichtiger ist) den Code verkürzt.

1voto

threejeez Punkte 2314

Nicht einmal 10 Minuten später fand ich das Problem. Das Problem lag nicht beim ObjectMapper, sondern daran, wie ich das ByteArrayOutputStream in einen String umgewandelt habe. Ich habe den Code wie folgt geändert und alles begann zu funktionieren:

try {
        return out.toString("utf-8");
    } catch (UnsupportedEncodingException e) {
        return out.toString();
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X