【问题标题】:How can I deseralize json object in java pojo class?如何反序列化 java pojo 类中的 json 对象?
【发布时间】:2012-12-06 09:48:44
【问题描述】:

我有一个非常符合需要的简单 JSON 语句。像这样

 {
       actor:{name:"kumar",mbox:"kumar@gmail.com"}
       verb :"completed"
    }

{
       actor:{name:["kumar","manish"],mbox:["kumar@gmail.com","manish@gmail.com"]}
       verb :{
            "id" : "http://adlnet.gov/expapi/verbs/completed",
        "display" : {
            "en-US" : "completed"
        }
    }

我正在使用 POJO 类来映射这个 json 字符串,并且 pojo 类代码给出了 bleow

@JsonProperty("actor")
Actor actor;
@JsonProperty("verb")
Verb objVerb;
@JsonProperty("verb")
String verb;
public Actor getActor() {
    return actor;
}
public void setActor(Actor actor) {
    this.actor = actor;
}
public Verb getObjVerb() {
    return objVerb;
}
public void setObjVerb(Verb objVerb) {
    this.objVerb = objVerb;
}
@JsonIgnore
public String getVerb() {
    return verb;
}
@JsonIgnore
public void setVerb(String verb) {
    this.verb = verb;
}
public static class Actor {
    String objectType;
    @JsonProperty("name")
    ArrayList<String> listName;
    @JsonProperty("name")
    String name;
    @JsonProperty("mbox")
    ArrayList<String> listMbox;
    @JsonProperty("mbox")
    String mbox;
    @JsonProperty("mbox_sha1sum")
    ArrayList<String> Listmbox_sha1sum;
    @JsonProperty("mbox_sha1sum")
    String mbox_sha1sum;
    @JsonProperty("openid")
    String openid;
    @JsonProperty("account")
    Account account;
    public String getObjectType() {
        return objectType;
    }

    public void setObjectType(String objectType) {
        this.objectType = objectType;
    }

    public ArrayList<String> getListName() {
        return listName;
    }

    public void setListName(ArrayList<String> listName) {
        this.listName = listName;
    }
    @JsonIgnore
    public String getName() {
        return name;
    }
    @JsonIgnore
    public void setName(String name) {
        this.name = name;
    }

    public ArrayList<String> getListMbox() {
        return listMbox;
    }

    public void setListMbox(ArrayList<String> listMbox) {
        this.listMbox = listMbox;
    }
    @JsonIgnore
    public String getMbox() {
        return mbox;
    }
    @JsonIgnore
    public void setMbox(String mbox) {
        this.mbox = mbox;
    }

    public ArrayList<String> getListmbox_sha1sum() {
        return Listmbox_sha1sum;
    }

    public void setListmbox_sha1sum(ArrayList<String> listmbox_sha1sum) {
        Listmbox_sha1sum = listmbox_sha1sum;
    }
    @JsonIgnore
    public String getMbox_sha1sum() {
        return mbox_sha1sum;
    }
    @JsonIgnore
    public void setMbox_sha1sum(String mbox_sha1sum) {
        this.mbox_sha1sum = mbox_sha1sum;
    }

    public String getOpenid() {
        return openid;
    }

    public void setOpenid(String openid) {
        this.openid = openid;
    }

    public Account getAccount() {
        return account;
    }

    public void setAccount(Account account) {
        this.account = account;
    }

    public static class Account {
        @JsonProperty("homePage")
        String homePage;
        @JsonProperty("name")
        String name;
        public String getHomePage() {
            return homePage;
        }
        public void setHomePage(String homePage) {
            this.homePage = homePage;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
}
public static class Verb {
    String id;
    Map<String,String> display;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public Map<String, String> getDisplay() {
        return display;
    }
    public void setDisplay(Map<String, String> display) {
        this.display = display;
    }
}

我正在使用 jaxb 和 jakson。我正在实现 web 服务来处理 json 语句 所以我使用bean类来映射json。但是当我用来映射这个 json 时,它会给出以下异常

org.codehaus.jackson.map.JsonMappingException : 名为“mbox”的属性有两个条目。

定义适当的 bean 结构,使其直接映射到 bean 类

【问题讨论】:

  • 不要使用诸如“请,帮助我等”之类的词。而不是这样清楚地解释您的问题并写下您如何尝试解决问题的努力。如果您找到解决方案,请接受或发布您的答案。

标签: json web-services rest serialization jaxb


【解决方案1】:

尽量只留下@JsonProperty("mbox") ArrayList&lt;String&gt; listMbox;字段(不需要@JsonProperty("mbox") String mbox;) 并将Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY=true 添加到Jackson 对象映射器配置中。

所以在反序列化中,它将能够同时获得数组和单个元素。

【讨论】:

  • 但是我可以为动词做什么。这也会产生异常。
  • 什么例外?关于动词:我不知道。你不能改变json的语法/结构吗?这不是很好的解决方案,但您可以使用@JsonProperty("verb") Object objVerb;,并且在反序列化时,在一种情况下它将是另一个 Map 中的字符串(您可以进行强制转换)。
【解决方案2】:

你可以使用 gson。

class cls = gson.fromJson(jsonString, clazz);

这里的jsonString可以是字符串化的java脚本对象。 gson.fromJson 方法可以将您的 java 脚本键映射到 java 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    相关资源
    最近更新 更多