2014-07-18 66 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