Java 如何在Pojo中将动态json值映射到HashMap

Java 如何在Pojo中将动态json值映射到HashMap,java,json,jackson,jax-rs,Java,Json,Jackson,Jax Rs,我使用jax-rs处理器的jackson json成员始终相同,其中只有1个成员具有动态值 此动态值只能是“”或json对象 json可能性1 { "event":"test", "eventInfo": "" } json可能性2 { "event" : "test", "eventInfo" : { "name" : "abc", "last" : "def" }

我使用jax-rs处理器的jackson

json成员始终相同,其中只有1个成员具有动态值

此动态值只能是“”或json对象

json可能性1

{
    "event":"test",
    "eventInfo": ""
}
json可能性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);
    }
}
@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";
}
jackson无法将上面显示的json转换为MyBean.java

如何做到这一点

原谅我的英语


谢谢

问题在于MyBean对象的
setEventInfo()
方法。在一种情况下,分配给它的值是空的,在另一种情况下,它被视为一个链接hashmap的字符串。因此,修改参数以接受对象。像

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 + "]";
    }
}

问题在于MyBean对象的
setEventInfo()
方法。在一种情况下,分配给它的值是空的,在另一种情况下,它被视为一个链接hashmap的字符串。因此,修改参数以接受对象。像

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 + "]";
    }
}

问题在于MyBean对象的
setEventInfo()
方法。在一种情况下,分配给它的值是空的,在另一种情况下,它被视为一个链接hashmap的字符串。因此,修改参数以接受对象。像

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 + "]";
    }
}

问题在于MyBean对象的
setEventInfo()
方法。在一种情况下,分配给它的值是空的,在另一种情况下,它被视为一个链接hashmap的字符串。因此,修改参数以接受对象。像

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 + "]";
    }
}

setEventInfo方法接受字符串值。它应该是对象吗?@AlexeyGavrilov我已经试过它作为对象了,但它也失败了。MyBean看起来不错。您如何调用receiveClientStatus?从浏览器?@skarist我使用JQuery POST,也使用application/json作为contentType,我认为发送json没有问题,我也在json在线验证中检查我的json。我发送的json与我展示的两个示例类似。我认为问题在于jackson无法将我的json转换为MyBean方法setEventInfo接受字符串值。它应该是对象吗?@AlexeyGavrilov我已经试过它作为对象了,但它也失败了。MyBean看起来不错。您如何调用receiveClientStatus?从浏览器?@skarist我使用JQuery POST,也使用application/json作为contentType,我认为发送json没有问题,我也在json在线验证中检查我的json。我发送的json与我展示的两个示例类似。我认为问题在于jackson无法将我的json转换为MyBean方法setEventInfo接受字符串值。它应该是对象吗?@AlexeyGavrilov我已经试过它作为对象了,但它也失败了。MyBean看起来不错。您如何调用receiveClientStatus?从浏览器?@skarist我使用JQuery POST,也使用application/json作为contentType,我认为发送json没有问题,我也在json在线验证中检查我的json。我发送的json与我展示的两个示例类似。我认为问题在于jackson无法将我的json转换为MyBean方法setEventInfo接受字符串值。它应该是对象吗?@AlexeyGavrilov我已经试过它作为对象了,但它也失败了。MyBean看起来不错。您如何调用receiveClientStatus?从浏览器?@skarist我使用JQuery POST,也使用application/json作为contentType,我认为发送json没有问题,我也在json在线验证中检查我的json。我发送的json与我展示的两个示例类似。我认为问题在于jackson无法将我的json转换为MyBean