2011-03-25 12 views
7

tengo una claseSerialización de pares clave/valor en Jackson?

class Foo { 
    String key; 
    String value; 
} 

y quiero serializar esto en "<content of key>":"<content of value>" ¿Cómo puedo lograr esto (y cómo deserializar "myKey":"myVal" en un objeto Foo?

yo estaba tratando de utilizar

@JsonValue 
public String toString() { 
    return "\"" + key + "\":\"" + value + "\""; 
} 

Pero está claro que terminar con demasiadas comillas.

@JsonValue 
public String toString() { 
    return key + ":" + value; 
} 

tampoco funciona, ya que no crea suficientes comillas.

+1

@JsonValue simplemente indicará que el valor de retorno se debe serializar como valor en lugar de POJO: de modo que si devuelve String, se convertirá en cadena JSON. No hay forma de usar esto para agregar entradas de Mapa, porque el contexto de salida puede ser una matriz, en cuyo caso el resultado sería JSON no válido. – StaxMan

Respuesta

14

He encontrado una manera, que está utilizando un JsonSerializer así:

public class PropertyValueSerializer extends JsonSerializer<Foo> { 

    @Override 
    public void serialize(Foo property_value, JsonGenerator jsonGenerator, 
          SerializerProvider serializerProvider) throws IOException, JsonProcessingException { 

     jsonGenerator.writeStartObject(); 
     jsonGenerator.writeFieldName(property_value.getKey()); 
     jsonGenerator.writeString(property_value.getValue()); 
     jsonGenerator.writeEndObject(); 
    } 

La clase Foo necesita saber acerca de esto:

@JsonSerialize(using = PropertyValueSerializer.class) 
public class Foo { 

deserializar es muy similar:

public class PropertyValueDeserializer extends JsonDeserializer<PROPERTY_VALUE> {  

    @Override 
    public Foo deserialize(JsonParser jsonParser, 
             DeserializationContext deserializationContext) throws IOException, JsonProcessingException { 

     String tmp = jsonParser.getText(); // { 
     jsonParser.nextToken(); 
     String key = jsonParser.getText(); 
     jsonParser.nextToken(); 
     String value = jsonParser.getText(); 
     jsonParser.nextToken(); 
     tmp = jsonParser.getText(); // } 

     Foo pv = new Foo(key,value); 
     return pv; 
    } 

Y esto también debe ser anotado en la clase Foo:

@JsonSerialize(using = PropertyValueSerializer.class) 
@JsonDeserialize(using = PropertyValueDeserializer.class) 
public class Foo implements Serializable{ 
+0

Sí, pero ¿por qué no dejarlo serializar como está? Simplemente agregue @JsonProperty al lado de sus campos y eso debería funcionar. O, como alternativa, puede usar @JsonAutoDetect para hacer que Jackson "encuentre" campos no públicos también. – StaxMan

+0

¿Qué quiere decir con "tal cual"? la clase Foo {String a; String b} se serializará en {"a": valueOfA, "b": valueOfB}? –

+0

Ah. Entonces solo quieres optimizarlo para tener una entrada contra dos entradas, la obtuve. – StaxMan

Cuestiones relacionadas