2014-07-18 111 views
0

到HashMap類我使用傑克遜JAX-RS處理如何映射動態JSON值POJO的

json的成員始終是一樣的,只有它的1名成員具有動態值..

這個充滿活力值可以只能是 「」 或JSON對象

JSON可能性1

{ 
    "event":"test", 
    "eventInfo": "" 
} 

JSON possibi lity 2

{ 
     "event" : "test", 
     "eventInfo" : { 
      "name" : "abc", 
      "last" : "def" 
     } 
    } 

eventInfo值只能是 「」 或JSON

我嘗試這個JSON映射到MyBean.java

MyBean.java

public class MyBean{ 

    private String event; 
    private Map<String, String> eventInfo = new HashMap<String, String>(); 

    public String getEvent() { 
     return event; 
    } 
    public void setEvent(String event) { 
     this.event = event; 
    } 

    @JsonAnyGetter 
    public Map getEventInfo() { 
     return eventInfo; 
    } 

    @JsonAnySetter 
    public void setEventInfo(String name, String value) { 
     this.eventInfo.put(name, value); 
    } 
} 

的映射過程發生在MyService.java中

MyService.java

@POST 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces("text/plain") 
public String receiveClientStatus(MyBean status){ 

    if(!status.getEventInfo().isEmpty()){ 
     String last = status.getEventInfo().get("last").toString() ; 
     System.err.println(last);   
    } 


    return "ok"; 
} 

傑克遜未能轉換JSON作爲展示上面MyBean.java

如何做到這一點?

原諒我的英語

感謝

+0

setEventInfo方法接受字符串值。它應該是對象嗎? –

+0

@AlexeyGavrilov我已經嘗試它作爲對象,但它也失敗 – user3852209

+0

MyBean看起來沒問題。你如何調用receiveClientStatus?從瀏覽器? – skarist

回答

1

的問題是爲myBean對象的setEventInfo()方法。在一種情況下,分配給它的值是空的,在其他情況下,它被視爲鏈接的哈希映射。所以修改參數來接受Object。像

class MyBean { 

    private String event; 
    private Map<String, String> eventInfo = new HashMap<String, String>(); 

    public String getEvent() { 
     return event; 
    } 

    public void setEvent(String event) { 
     this.event = event; 
    } 

    @JsonAnyGetter 
    public Map getEventInfo() { 
     return eventInfo; 
    } 

    @JsonAnySetter 
    public void setEventInfo(Object eventObject) { 
     if(eventObject instanceof Map){ 
      this.eventInfo.putAll((Map<String, String>) eventObject); 
     } 
    } 

    @Override 
    public String toString() { 
     return "MyBean [event=" + event + ", eventInfo=" + eventInfo + "]"; 
    } 
} 

現在它應該工作。例如

String json1 = "{ \"event\":\"test\", \"eventInfo\": \"\" }"; 
String json2 = "{\"event\":\"test\",\"eventInfo\":{\"name\":\"abc\",\"last\":\"def\"}}"; 
ObjectMapper mapper = new ObjectMapper(); 
try { 
    MyBean bean1 = mapper.readValue(json1, MyBean.class); 
    System.out.println(bean1); 
    MyBean bean2 = mapper.readValue(json2, MyBean.class); 
    System.out.println(bean2); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

非常感謝先生 – user3852209