2011-12-06 24 views
5

clase de objeto:Jackson: la conversión de JSON que contiene clase de objeto a Mapa

class User{ 
    public String name; 
    public String password; 
} 

JSON:

{ sc:"200", msg:"something", userInfo:{name:"n", password:"p"} } 

quiero conseguir resultados así:

Map->contains 3 key-value 
"sc"="200" 
"msg"="something" 
"userInfo"=User(Object Class) 

¿Cómo puedo ¿hacer esto? O bien, ¿cómo puedo conseguir que use otro paquete de herramientas JAR?

Respuesta

8

usted tiene que elegir si desea que "sin tipo" (mapas, listas, envolturas), que son bastante fáciles de conseguir:

Map<String,Object> map = new ObjectMapper().readValue(json, Map.class); 

o POJO. La cosa es que el asignador realmente no puede saber que quiere que "userInfo" se asigne a un objeto específico, sino que otros valores a otra cosa.

Pero preferiría simplemente crear otra clase, como:

public class Request { 
    public int sc; 
    public String message; 
    public User userInfo; 
    // and/or getters, setters, if you prefer 
} 

y obligar a que:

Request req = new ObjectMapper().readValue(json, Request.class); 

¿Por qué meterse con mapas inconvenientes cuando se puede tener POJOs reales, ¿verdad? :)

+0

^_^hei hei! Muchas gracias, pero realmente quiero saber si hay alguna manera de conseguirlo. – YETI

+1

La anotación @JsonAnySetter puede hacer lo que está intentando lograr. Voy a publicar un ejemplo. –

3

Como una ligera modificación de la respuesta de StaxMan, si se trata de alguna manera deseable tener todo lo que no es el objeto User en un mapa, Jackson proporciona los @JsonAnySetter y @JsonAnyGetter anotaciones a realizar el trabajo. El siguiente ejemplo demuestra cómo se podría usar esto.

import java.util.HashMap; 
import java.util.Map; 

import org.codehaus.jackson.annotate.JsonAnySetter; 
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; 
import org.codehaus.jackson.annotate.JsonMethod; 
import org.codehaus.jackson.map.ObjectMapper; 

public class JacksonFoo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    // {"sc":"200","msg":"something","userInfo":{"name":"n","password":"p"}} 
    String jsonInput = "{\"sc\":\"200\",\"msg\":\"something\",\"userInfo\":{\"name\":\"n\",\"password\":\"p\"}}"; 

    ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY); 

    Result result = mapper.readValue(jsonInput, Result.class); 
    System.out.println(result); 
    // output: 
    // Result: userInfo=User: name=n, password=p, otherThings={sc=200, msg=something} 
    } 
} 

class Result 
{ 
    Map otherThings = new HashMap(); 
    User userInfo; 

    @JsonAnySetter 
    void addThing(String key, Object value) 
    { 
    otherThings.put(key, value); 
    } 

    @Override 
    public String toString() 
    { 
    return String.format("Result: userInfo=%s, otherThings=%s", userInfo, otherThings); 
    } 
} 

class User 
{ 
    String name; 
    String password; 

    @Override 
    public String toString() 
    { 
    return String.format("User: name=%s, password=%s", name, password); 
    } 
} 
+0

-_- ||| Gracias, es poderoso, pero no coincide con mi punto. – YETI

+0

Este trabajo para mí, importante para pu nuevo HashMap(); ;) –

Cuestiones relacionadas