2010-11-16 25 views
20

Tengo un objeto JSON, por ejemplo:Binding JSON propiedad objeto secundario en el campo de objeto Java en Jackson

{ 
    "foo": { 
    "bar": 1 
    }, 
    "baz": 2 
} 

y quiero unir en un objeto de Java, como:

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Foo { 
    private int bar; 
    @JsonProperty("baz") 
    private int baz; 
} 

Cómo ¿Puedo establecer el valor de foo.bar de JSON en el campo bar en el objeto de Java Foo?

He intentado anotar el campo con @JsonProperty("foo.bar"), pero no funciona así.

Respuesta

43

Esto no es perfecto, pero es la forma más elegante que pude encontrar.

@JsonProperty("foo") 
public void setFoo(Map<String, Object> foo) { 
    bar = (Integer) foo.get("bar"); 
} 
2

No hay funcionalidad automatizada para esto (hasta donde yo sé), pero esta es una característica solicitada con frecuencia; existe esta Jira RFE: http://jira.codehaus.org/browse/JACKSON-132 que suena como lo que estás buscando.

+0

Si ese es el mismo problema, aunque yo lo uso para deserialización . Supongo que mi solución anterior es la mejor que puedo obtener si no quiero cambiar la estructura del objeto 'Foo'. – hleinone

+0

Sí, creo que sí. – StaxMan

-16

¡Eso es como unir una manzana a una naranja! Otra "frase pegadiza" sería "Impedance Mismatch", o en Star Trek 1, "Non Sequetor!" Enlazarlo con un objeto COINCIDIDO, luego hacer una nueva asignación en Java entre los diferentes tipos de objetos.

+8

No es realmente útil. No me gustaría crear clases Java inútiles solo porque alguien no podría diseñar una API JSON decente. – hleinone

+3

De acuerdo con @hleinone. Uno no siempre tiene el control de la API y tener que crear clases/mapas/hacks/vudú anidados no es la solución correcta. – kontinuity

-3

Aquí un ejemplo rápido que funciona:

JSON:

[{"function":{"name":"Function 1"}}, 
{"function":{"name":"Function 2"}}] 

Java:

import java.util.Map; 

import javax.xml.bind.annotation.XmlRootElement; 

import lombok.Getter; 
import lombok.Setter; 
import lombok.ToString; 

import org.codehaus.jackson.annotate.JsonIgnoreProperties; 
import org.codehaus.jackson.annotate.JsonProperty; 
@Getter 
@Setter 
@ToString 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class Function { 
    @JsonProperty("name") 
    private String name; 

    @JsonProperty("function") 
    public void setFunction(Map<String, Object> function) { 
     name = (String) function.get("name"); 
    } 
} 
+1

Esto no es diferente de la respuesta aceptada. – hleinone

+1

¿Por qué la necesidad de incluir un montón de cosas lombok en su respuesta? Realmente tendría el mismo resultado sin esos. –

Cuestiones relacionadas