2017-05-15 5 views
0

Ich versuche, eine Eigenschaft basierend auf der Ansicht zu serialisieren. Leider funktioniert der folgende Code nicht, da Jackson eine in Konflikt stehende Getter-Property "userId" meldet. Gibt es eine Möglichkeit, ein Objekt gemäß der Ansicht in einer bestimmten Darstellung zu erhalten?Jackson JSON Deserialisierung mit Ansichten

@JsonView(Views.Mongo.class) 
    @JsonProperty("userId") 
    public ObjectId getUserId() { 
     return userId; 
    } 

    @JsonView(Views.Frontend.class) 
    @JsonProperty("userId") 
    public String getUserIdAsString() { 
     return userId.toString(); 
    } 

Dies ist, was ich will:

Ansicht 1:

{ userId: { '$oid' : "16418256815618" } } 

Ansicht 2:

{ userId: "16418256815618" } 

Antwort

0

Ich denke, Sie einen benutzerdefinierten Serializer schreiben können, die diese Aufgabe tut basierte auf der aktiven Ansicht wie unten gezeigt.

public class ObjectIdSerializer extends JsonSerializer<ObjectId> { 

    @Override 
    public void serialize(ObjectId objectId, JsonGenerator gen, SerializerProvider provider) throws IOException { 
     if (provider.getActiveView() == Frontend.class) { 
      gen.writeString(objectId.toString()); 
     } else { 
      // Do default serialization of ObjectId. 
      gen.writeStartObject(); 
      gen.writeFieldName("idField1"); 
      gen.writeString(objectId.getIdField1()); 
      gen.writeFieldName("idField2"); 
      gen.writeString(objectId.getIdField2()); 
      gen.writeEndObject(); 
     } 
    } 
} 

ändern Sie dann Ihre pojo wie unten

gezeigt
@JsonSerialize(using=ObjectIdSerializer.class) 
public ObjectId getUserId() { 
    return userId; 
} 

Sie müssen keine Ansicht Anmerkung auf Ihrem Getter/Feld passieren, wie es Pflege in benutzerdefinierten Serializer genommen wird.

In diesem Beispiel habe ich die Standardserialisierung manuell durchgeführt. Alternativ können Sie den Standard-Serializer verwenden, indem Sie einen Serializer-Modifikator registrieren, wie in der Frage How to access default jackson serialization in a custom serializer erläutert.

+0

Danke! Das hat für mich funktioniert. – user2443205

Verwandte Themen