将字符串转换为jsonobject时发生异常

时间:2014-10-29 10:03:02

标签: java json

我的servlet中有一个字符串,格式如下。

 {
        "name": "Jam",
        "noOfBooksRequired": "2",
        "type": "Type 1",
        "bookName": [
            "The Magic",
            "The Power"
        ]
    }

bookName是一个数组。我想访问数组中的值并填充bean。但是,当我尝试将字符串转换为jsonobject时,我得到以下异常,因为bookName是一个数组com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY这就是我试图这样做的方式

     JSONObject js= new JSONObject();
     String inputData= request.getParameter("inputData");
     HashMap<String, String> hmap= new HashMap<String, String>();


     Type type = new TypeToken<HashMap<String, String>>(){}.getType();
     hmap = gson.fromJson(inputData, type);
     js.putAll(hmap);

我正在做的是,我将字符串转换为地图,然后将其添加到JSONObject。

因为有许多json序列化器并且不确定哪个是最好的。现在,我有net.sf.json.JSONObjectcom.google.gson.JsonObject

有人可以帮我解决这个问题。

提前致谢

1 个答案:

答案 0 :(得分:3)

您可以将JSON映射到POJO 如果该书除了名称之外还有更多属性,您将需要两个POJO,如下所示。

这本书的POJO:

class Book {

    private String name;
    private String author;

    public Book() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }
}

货架的POJO,其中包含一系列书籍:

class Shelf {

    private String name;
    private Integer noOfBooksRequired;
    private String type;
    private List<Book> books;

    public Shelf() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getNoOfBooksRequired() {
        return noOfBooksRequired;
    }

    public void setNoOfBooksRequired(Integer noOfBooksRequired) {
        this.noOfBooksRequired = noOfBooksRequired;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public List<Book> getBooks() {
        return books;
    }

    public void setBooks(List<Book> books) {
        this.books = books;
    }
}

您的JSON将如下所示:

{
    "name": "Jam",
    "noOfBooksRequired": "2",
    "type": "Type 1",
    "books": [
        {"name": "The Magic", "author": "John Doe"},
        {"name": "The Power", "author": "Jane Doe"}
    ]
}

然后你可以使用Gson来解析你的JSON:

Gson gson = new Gson();
Shelf shelf = gson.fromJson(inputData, Shelf.class);

更新

考虑到您的JSON看起来像这样(该书可以表示为String):

{
    "name": "Jam",
    "noOfBooksRequired": "2",
    "type": "Type 1",
    "books": [
        "The Magic",
        "The Power"
    ]
}

只有一个列有String的POJO就足够了:

class Shelf {

    private String name;
    private Integer noOfBooksRequired;
    private String type;
    private List<String> books;

    public Shelf() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getNoOfBooksRequired() {
        return noOfBooksRequired;
    }

    public void setNoOfBooksRequired(Integer noOfBooksRequired) {
        this.noOfBooksRequired = noOfBooksRequired;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public List<String> getBooks() {
        return books;
    }

    public void setBooks(List<String> books) {
        this.books = books;
    }
}