gpt4 book ai didi

java - 将 JSON 解析为 java 对象

转载 作者:行者123 更新时间:2023-12-02 04:21:55 25 4
gpt4 key购买 nike

我试图通过从 JSON 文件中检索类别项目列表来将 JSON 解析为 java 对象,但出现错误,如下所示:

错误:

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]

这是我检索类别对象的代码:

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;

}

我的 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"
} ]

类别.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:

@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;
}

有人知道问题出在哪里吗?我需要检索类别列表。

最佳答案

首先您需要一个包含类别列表的包装器。并且您的方法应该期望该包装器的列表。

这是包装

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;
}
}

这是您的新方法。

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

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

说明

现在,让我解释一下您的 JSON。您的 JSON 包含一个对象数组。该对象有一个属性名称category

[ {
"category" : ...
} ]

我们定义了 CategoryWrapper 来表示该对象。根据您的 JSON category 也是一个对象数组。然后您创建Category来表示该对象。

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

Category 具有三个不同的属性,名为 taskfloatTaskevent。每个属性也由对象数组表示。

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

该对象在java中被定义为Task。每个 Task 也有一些属性,如提醒、结束日期等。

[ {
"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":[{...},{...}...]
},
{...}
]
} ]

它们中的每一个都可以显示为 java 对象。您不需要创建更多的类。

关于java - 将 JSON 解析为 java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32683363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com