2011-12-06 18 views
5

Nesne Class Haritaya:jackson: Nesne sınıfını içeren JSON dönüştürme

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

JSON:

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

böyle sonuçlar almak istiyoruz:

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

Ben nasıl Bunu yap? Veya başka bir JAR araçları paketini nasıl kullanabilirim?

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

veya POJOs:

cevap

8

Sen almak için yeterli kolaydır "türsüz" (Haritalar, Listeler, sargılar), isterseniz seçim yapmak zorunda. İşin aslı, haritacı, "userInfo" nun belirli bir nesneye, ama başka bir şeye başka değerlere eşlenmesini istediğini gerçekten bilemez.

Ama doğrusu gibi başka sınıf, yaratacak:

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

ve buna bağlanan:

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

Neden sakıncalı Maps ile karışıklık doğru, gerçek POJOs sahip olabilir? Bir haritada User nesne değil her şeye sahip olmak her nasılsa arzu varsa :)

+0

^_^hei hei! Çok teşekkürler , ama gerçekten bilmek istiyorum ki bunu elde etmenin bir yolu var. – YETI

+1

@JsonAnySetter ek açıklaması, yapmaya çalıştığınız şeyi yapabilir. Bir örnek gönderirim. –

3

StaxMan en cevabın ufak bir değişiklikle olarak, Jackson işin yapılması için @JsonAnySetter ve @JsonAnyGetter belirteç sağlar. Aşağıdaki örnek, bunun nasıl kullanılacağını gösterir.

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

-_- ||| Sağol, güçlü, ama benim noktaya uymuyor. – YETI

+0

Bu çalışma benim için önemli, yeni yeni HashMap(); ;) –