Liebe Leute, ich brauche dich beraten.Deserializing JSON eingebetteten Knoten als Wert in Map mit Jackson
Ich versuche, benutzerdefinierte Jackson
Deserializer für Karten zu implementieren, aber Schwierigkeiten damit. Als Eingangsdaten habe ich folgendes json:
{
"someMap": {
"one_value": "1",
"another_value: "2"
},
"anotherMap": "{\"100000000\": 360000,\"100000048\": 172800,\"100000036\": 129600,\"100000024\": 86400,\"100000012\": 43200}"
}
Wie Sie im zweiten Fall sehen kann json Karte innerhalb Knotenwert hat (ich es auf diese Weise durch die Absicht zu tun, weil ich das ersetzt werden soll. Wert von env Variable: "anotherMap": "${SOME_MAP:-{\"100000000\": 360000,\"100000048\": 172800,\"100000036\": 129600,\"100000024\": 86400,\"100000012\": 43200}}"
). Wie ich es verstehe muss ich irgendwie zwischen diesen 2 Karten Deserialisierungsflüssen unterscheiden. Also für die erste Karte muss ich Standard-Karten-Deserializer für den zweiten verwenden, den benutzerdefinierten, um die Karte korrekt aus dem Wert zu analysieren. Im Moment habe ich diesen Code, das zu tun:
// invokation code
new ObjectMapper().registerModule(new ConfigModule()).readValue(is, ConfigModuleTestConfigWrapper.class);
// module code
public class ConfigModule extends SimpleModule {
@Override
public void setupModule(SetupContext context) {
super.setupModule(context);
context.addDeserializers(new Deserializers.Base() {
@Override
public JsonDeserializer<?> findMapDeserializer(MapType type, DeserializationConfig config, BeanDescription beanDesc,
KeyDeserializer keyDeserializer, TypeDeserializer elementTypeDeserializer,
JsonDeserializer<?> elementDeserializer) throws JsonMappingException {
return new MapPropertyDeserializer(type);
}
});
}
private static class MapPropertyDeserializer extends StdScalarDeserializer<Map<String, Integer>> {
MapPropertyDeserializer(MapType type) {
super(type);
}
@Override
public Map<String, Integer> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
JsonNode node = p.readValueAsTree();
if (node == null || node.isContainerNode()) {
// return <default jackson deserializer>
}
System.out.println("isContainerNode ?: " + node.isContainerNode());
System.out.println("isValueNode ?: " + node.isValueNode());
// some parsing flow goes below
JsonNode valueNode = node.get(1);
valueNode.asText();
return new HashMap<>();
}
}
// bean description
@JsonIgnoreProperties
public class ConfigSubstitutorModuleTestConfigWrapper {
private final Map<String, String> someMap;
private final Map<String, Integer> anotherMap;
@JsonCreator
public ConfigSubstitutorModuleTestConfigWrapper(
@JsonProperty("someMap") Map<String, String> someMap,
@JsonProperty("anotherMap") Map<String, Integer> anotherMap
) {
this.someMap = someMap;
this.anotherMap = anotherMap;
}
public Map<String, String> getSomeMap() {
return someMap;
}
public Map<String, Integer> getAnotherMap() {
return anotherMap;
}
}
Das Problem ist (wie ich sie verstehe :)), dass ich weiß nicht, wie Standard-Karte Deserializer von der deserialize Methode zurückzukehren.
Hat jemand irgendeine Ahnung, was ich dort tun könnte, um das gewünschte Ziel zu erreichen? Schließlich
Hättest du nicht lieber das Teil beheben, die diese hässliche JSON-String innerhalb JSON erzeugt? Das ist der Teil, der für mich gebrochen aussieht. –
Ich kann das nicht tun. Die Idee hier ist, den hässlichen JSON mit einem Wert von der Umgebungsvariablen wie dem zu ersetzen "" anotherMap ":" $ {SOME_MAP: - {\ "100000000 \": 360000, \ "100000048 \": 172800, \ "100000036 \": 129600, "100000024": 86400, "100000012": 43200}} ". Also mache ich es mit Absicht. –
möglich duplizieren von http://stackoverflow.com/questions/18313323/how-do-i-call-the-default-deserializer-from-a-custom-deserializer-in-jackson –