Serialize / Deserialize Map & lt; String, Object & gt; mit Jackson

Habe ich eine Klasse, die wie folgt aussieht

public class MyClass {
   private String val1;
   private String val2;
   private Map<String,Object> context;
   //Appropriate accessors removed for brevity.
   ...
}

Ich bin auf der Suche, um in der Lage sein, um die round-trip-mit Jackson von Objekt zu JSON und zurück. Ich kann serialisieren Sie das Objekt über feine und erhalten die folgende Ausgabe:

{
    "val1": "foo",
    "val2": "bar",
    "context": {
        "key1": "enumValue1",
        "key2": "stringValue1",
        "key3": 3.0
    }
}

Das Problem, das ich bin, in Betrieb ist, da die Werte, die in die serialisierte map nicht haben jede Art von Informationen, Sie sind nicht korrekt deserialisiert. Zum Beispiel, in dem obigen Beispiel, enumValue1 sollte deserialisiert werden als enum-Wert, sondern deserialisiert als String. Ich habe gesehen, Beispiele für stützen, welche Art auf eine Vielzahl von Dingen, aber in meinem Szenario, ich will nicht wissen, was die Typen sind (Sie werden Nutzer-generierte Objekte, die ich nicht im Voraus wissen) also ich muss in der Lage sein serialisiert werden die Typ-Informationen mit den Schlüssel-Wert-paar. Wie kann ich erreichen das mit Jackson?

Für das Protokoll, ich bin mit Jackson version 2.4.2. Der code, den ich verwende zum testen die hin-und Rückfahrt wie folgt:

@Test
@SuppressWarnings("unchecked")
public void testJsonSerialization() throws Exception {
    //Get test object to serialize
    T serializationValue = getSerializationValue();
    //Serialize test object
    String json = mapper.writeValueAsString(serializationValue);
    //Test that object was serialized as expected
    assertJson(json);
    //Deserialize to complete round trip
    T roundTrip = (T) mapper.readValue(json, serializationValue.getClass());
    //Validate that the deserialized object matches the original one
    assertObject(roundTrip);
}

Da dies eine Spring-basierte Projekt, der mapper wird wie folgt erstellt:

@Configuration
public static class SerializationConfiguration {

    @Bean
    public ObjectMapper mapper() {
        Map<Class<?>, Class<?>> mixins = new HashMap<Class<?>, Class<?>>();
        //Add unrelated MixIns
        .. 

        return new Jackson2ObjectMapperBuilder()
                .featuresToDisable(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS)
                .dateFormat(new ISO8601DateFormatWithMilliSeconds())
                .mixIns(mixins)
                .build();
    }
}

InformationsquelleAutor der Frage Michael Minella | 2015-01-09

Schreibe einen Kommentar