简体   繁体   English

将JSON解析为Java对象

[英]Parse JSON to java object

I'm trying to parse JSON to java object by retrieving a list of category item from JSON file but there is an error as shown: 我正在尝试通过从JSON文件中检索类别项目列表来将JSON解析为java对象,但是出现如下所示的错误:

Error: 错误:

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
     at [Source: java.io.StringReader@6be46e8f; line: 1, column: 1]

Here is my code to retrieve category object: 这是我检索类别对象的代码:

public ArrayList<Category> getAllTasksFromFile(String jsonString) throws JsonParseException, JsonMappingException, IOException {
     ObjectMapper mapper = new ObjectMapper();
                mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

     ArrayList<Category> allTasks = mapper.readValue(jsonString, new TypeReference<ArrayList<Category>>() {});

     return allTasks;

} }

My JSON file that shows 1 category (actual file has many categories): 我的JSON文件显示1个类别(实际文件具有许多类别):

      [ {
  "categories" : {
    "task" : [ {
      "reminder" : 123,
      "endDate" : "-1",
      "name" : "Do homework",
      "description" : "Do it now",
      "startTime" : -1,
      "endTime" : -1,
      "priority" : 5,
      "isDone" : false,
      "startDate" : "-1"
    }, {
      "reminder" : 123,
      "endDate" : "-1",
      "name" : "Do homework",
      "description" : "Do it now",
      "startTime" : -1,
      "endTime" : -1,
      "priority" : 5,
      "isDone" : false,
      "startDate" : "-1"
    } ],
    "floatTask" : [ {
      "reminder" : 123,
      "endDate" : "-1",
      "name" : "Do homework",
      "description" : "Do it now",
      "startTime" : -1,
      "endTime" : -1,
      "priority" : 5,
      "isDone" : false,
      "startDate" : "-1"
    }, {
      "reminder" : 123,
      "endDate" : "-1",
      "name" : "Do homework",
      "description" : "Do it now",
      "startTime" : -1,
      "endTime" : -1,
      "priority" : 5,
      "isDone" : false,
      "startDate" : "-1"
    } ],
    "event" : [ {
      "reminder" : 123,
      "endDate" : "-1",
      "name" : "Do homework",
      "description" : "Do it now",
      "startTime" : -1,
      "endTime" : -1,
      "priority" : 5,
      "isDone" : false,
      "startDate" : "-1"
    }, {
      "reminder" : 123,
      "endDate" : "-1",
      "name" : "Do homework",
      "description" : "Do it now",
      "startTime" : -1,
      "endTime" : -1,
      "priority" : 5,
      "isDone" : false,
      "startDate" : "-1"
    } ]
  },
  "categoryName" : "categories"
} ]

Category.java Category.java

    public class Category {

    private List<Task> task;
    private List<Task> floatTask;
    private List<Task> event;

    public List<Task> getTask() {
        return task;
    }

    public void setTask(List<Task> task) {
        this.task = task;
    }

    public List<Task> getFloat() {
        return floatTask;
    }

    public void setTaskType(List<Task> floatTask) {
        this.floatTask = floatTask;
    }

    public List<Task> getEvent() {
        return event;
    }

    public void setEvent(List<Task> event) {
        this.event = event;
    }
}

JSON: JSON:

@SuppressWarnings("unchecked")
    public JSONArray addNewCategory(String categoryName) {
        Task newTask = new Task("Do homework", "Do it now", 5, 123, "School", false);

        JSONArray category = new JSONArray();
        JSONObject categoryObject = new JSONObject();
        JSONArray array = new JSONArray();

        JSONObject arrayElementOne = new JSONObject();
        JSONArray arrayElementOneArray = new JSONArray();

        JSONObject arrayElementOneArrayElementOne = convertTaskToJSON(newTask);
        JSONObject arrayElementOneArrayElementTwo = convertTaskToJSON(newTask);

        arrayElementOneArray.add(arrayElementOneArrayElementOne);
        arrayElementOneArray.add(arrayElementOneArrayElementTwo);

        arrayElementOne.put("floatTask", arrayElementOneArray);
        arrayElementOne.put("task", arrayElementOneArray);
        arrayElementOne.put("event", arrayElementOneArray);

        array.add(arrayElementOne);
        categoryObject.put(categoryName, array);
        category.add(categoryObject);

        return category;
    }

Anyone knows what the problem might be? 有人知道可能是什么问题吗? I need to retrieve the list of categories. 我需要检索类别列表。

First you need a wrapper which contains category list. 首先,您需要一个包含类别列表的包装器。 And your method should expect list of that wrapper. 而且您的方法应该包含该包装的列表。

Here is the wrapper 这是包装纸

import java.util.List;

public class CategoryWrapper {

    private List<Category> category;

    public List<Category> getCategory() {
        return category;
    }

    public void setCategory(List<Category> category) {
        this.category = category;
    }
}

And here is the your new method. 这是您的新方法。

    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    ArrayList<CategoryWrapper> allTasks = mapper.readValue(jsonString, new TypeReference<ArrayList<CategoryWrapper>>() {});

Explanation 说明

Now, let me explain your JSON. 现在,让我解释一下您的JSON。 Your JSON contains an array of objects. 您的JSON包含一个对象数组。 This object has a property name category . 该对象具有属性名称category

[ {
  "category" : ...
} ]

We defined our CategoryWrapper to represent that object. 我们定义了CategoryWrapper来表示该对象。 According to your JSON category is also an array of objects. 根据您的JSON category ,对象也是一个数组。 And you create Category to represent that object. 然后创建Category来表示该对象。

[ {
  "category" : [{...},{...}...]
} ]

Category has three different property named task , floatTask and event . Category具有三个不同的属性,分别名为taskfloatTaskevent Each of properties is also represented by array of object. 每个属性也都由对象数组表示。

[ {
  "category" : [{
                  "task":[{...},{...}...],
                  "floatTask":[{...},{...}...],
                  "event":[{...},{...}...]
                },
                {...}
               ]
} ]

This object is defined as Task in java. 该对象在Java中定义为Task Each Task is also has some properties like reminder, endDate etc. 每个Task还具有一些属性,如提醒,endDate等。

[ {
  "category" : [{
                  "task":[{
                        "reminder" : 123,
                        "endDate" : "-1",
                        "name" : "Do homework",
                        "description" : "Do it now",
                        "startTime" : -1,
                        "endTime" : -1,
                        "priority" : 5,
                        "isDone" : false,
                        "startDate" : "-1"
                   }],
                  "floatTask":[{...},{...}...],
                  "event":[{...},{...}...]
                },
                {...}
               ]
} ]

Each of them can be shown as java objects. 它们每个都可以显示为java对象。 You do not need to create more classes. 您不需要创建更多的类。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM