2016-07-30 15 views
1

Ich versuche, die folgende Zeichenfolge mit dem Jackson deserialize.Wie Wrapper-Objekt in Jackson Json Deserialisierung überspringen

{ 
    "roomName": "u8ec29p0j7q2m9f", 
    "broadcastPresenceRoles": { 
    "broadcastPresenceRole": [ 
     "moderator", 
     "participant", 
     "visitor" 
    ] 
    }, 
    "owners": { 
    "owner": "[email protected]" 
    }, 
    "admins": { 
    "admin": "[email protected]" 
    }, 
    "members": null, 
    "outcasts": { 
    "outcast": [ 
     "[email protected]", 
     "[email protected]" 
    ] 
    }, 
    "ownerGroups": { 
    "ownerGroup": "Friends" 
    } 
} 

Dies ist die Antwort von Openfire Rest Apis. Ich habe ein Problem mit dem Wrapper-Objekt, das die Arrays umhüllt. Hier

"broadcastPresenceRoles": { 
    "broadcastPresenceRole": [ 
     "moderator", 
     "participant", 
     "visitor" 
    ] 
    }, 

Ich versuchte this die Container auspacken, aber nicht den Erfolg zu bekommen. Ich denke nicht, Wrapper-Klassen zu schreiben ist eine gute Idee (Da ich mehrere Wrapper-Klassen schreiben muss). Auch brauche ich die verallgemeinerte Lösung, damit ich sie mit anderen Antworten verwenden kann, da die API andere Antworten im ähnlichen Wrapped-Format hat . Danke im Voraus.

Antwort

2

Sie können eine benutzerdefinierte Annotation mit @JsonDeserialize innerhalb erstellen und eine benutzerdefinierte erstellen, die ContextualDeserializer implementiert. Die Idee ist von the solution inspiriert, die Sie erwähnten, aber es ist allgemeiner, irgendeine Eigenschaft in einem json-Objekt auszupacken.

Im Anschluss an die benutzerdefinierte Anmerkung mit @JacksonAnnotationsInside als Annotation Behälter @JsonDeserialize enthält:

@Retention(RetentionPolicy.RUNTIME) 
@JacksonAnnotationsInside 
@JsonDeserialize(using = JsonUnwrapPropertyDeserializer.class) 
public @interface JsonUnwrapProperty { 
} 

und die benutzerdefinierte JsonDeserializer die ContextualDeserializer implementiert:

public class JsonUnwrapPropertyDeserializer extends JsonDeserializer<Object> implements ContextualDeserializer { 

    private JavaType unwrappedJavaType; 
    private String unwrappedProperty; 

    @Override 
    public JsonDeserializer<?> createContextual(final DeserializationContext deserializationContext, final BeanProperty beanProperty) throws JsonMappingException { 
     unwrappedProperty = beanProperty.getMember().getName(); 
     unwrappedJavaType = beanProperty.getType(); 
     return this; 
    } 

    @Override 
    public Object deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException { 
     final TreeNode targetObjectNode = jsonParser.readValueAsTree().get(unwrappedProperty); 
     return jsonParser.getCodec().readValue(targetObjectNode.traverse(), unwrappedJavaType); 
    } 
} 

und die Verwendungsbeispiel:

public class MyBean { 

    @JsonProperty("broadcastPresenceRoles") 
    @JsonUnwrapProperty 
    private List<String> broadcastPresenceRole; 

    @JsonProperty("admins") 
    @JsonUnwrapProperty 
    private String admin; 

    // constructor, getter and setter 
} 

@JsonProperty ist das Wrapper-Objekt zu suchen und @JsonUnwrappProperty soll das JSON-Objekt deserialisieren und eine Eigenschaft in das mit Anmerkungen versehene Feld extrahieren.

Edited:

Es folgt ein Beispiel mit ObjectMapper:

String json = "{\n" + 
     " \"broadcastPresenceRoles\": {\n" + 
     " \"broadcastPresenceRole\": [\n" + 
     "  \"moderator\",\n" + 
     "  \"participant\",\n" + 
     "  \"visitor\"\n" + 
     " ]\n" + 
     " },\n" + 
     " \"admins\": {\n" + 
     " \"admin\": \"[email protected]\"\n" + 
     " }\n" + 
     "}"; 

final ObjectMapper mapper = new ObjectMapper(); 
final MyBean myBean = mapper.readValue(json, MyBean.class); 

System.out.println(myBean.getBroadcastPresenceRole()); 
System.out.println(myBean.getAdmin()); 

Ausgang:

[Moderator, Teilnehmer, Besucher]

Sanjeet @ shahanshah

+0

habe ich versucht, so, wie Sie vorgeschlagen und ich erhalte folgende exception- W/System.err: com.fasterxml.jackson.databind.JsonMappingException: (war java.lang.NullPointerException) (durch Referenzkette: com.sked .jacksonparsingexample.entity.MyBean ["broadcastPresenceRoles"]) –

+0

Verursacht von: java.lang.NullPointerException 07-31 23: 43: 13.920 24840-24840/com.sked.jacksonparsingexample W/System.err: at com.sked. jacksonparsingexample.util.JsonUnwrapPropertyDeserializer.deserialize (JsonUnwrapPropertyDeserializer.java:33) –

+0

Ich habe direkt die Klassen kopiert, die Sie angegeben haben, und ich habe mit der JSON-Zeichenfolge nur mit zwei Eigenschaften versucht. –

Verwandte Themen