我正在使用Java Spring和Jackson共享来自合作伙伴网络服务的JSON数据,而我遇到了一个难以克服的挑战。问题是有时我需要消耗的数据包含 特定类型的单个元素,有时数据包含这些元素的完整列表(如果我没有在这里使用正确的JSON术语,请原谅我)。例如:
{
"number": "12121212",
"activity": { "status": "in transit", "date": "20100429" }
}
这包含一个“activity”元素。然后在下一个示例中,有一个“活动”元素列表:
{
"number": "12121212",
"activity": [{ "status": "arrived", "date": "20160430" }, { "status": "in transit", "date": "20160429" }, { "status": "shipping", "date": "20160429"}]
}
我正在使用com.fasterxml.jackson.databind.ObjectMapper将JSON映射到java bean,这是我的两个bean:
public class Activity {
private String status;
private String date;
/* getters and setters */
}
public class Message {
private String number;
private Activity activity;
/* getters and setters */
}
我的调用代码就是这样:
public static void main(String[] args) {
Messages m = new Messages();
String jsonMessage = getJsonMessage(); // This gets the JSON message to be run through ObjectMapper
ObjectMapper mapper = new ObjectMapper();
try {
Message message = mapper.readValue(jsonMessage, Message.class);
} catch (Exception e) {
e.printStackTrace();
}
} // end method main()
当我在接收带有单个“activity”元素的JSON消息时执行此代码时,它可以正常工作。当使用“activity”元素列表执行它时,我收到以下错误:
com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.graybar.utilities.parsejson.Activity out of START_ARRAY token
将Message Bean更改为以下内容使代码在处理“activity”元素列表时起作用:
public class Message {
private String number;
private ArrayList<Activity> activity;
/* getters and setters */
}
但是,现在代码不适用于单个“activity”元素。我收到以下错误:
com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
我必须想象有一种简单的方法可以处理Jackson框架中的单个或一个元素实例列表,但不幸的是我找不到它。
感谢任何帮助!
-Stephen Spalding
答案 0 :(得分:1)
@varren提供了上面的链接,帮助我找到解决方案。我在调用方法中添加了以下代码行:
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
所以,完整的方法看起来像这样:
public static void main(String[] args) {
Messages m = new Messages();
String jsonMessage = getJsonMessage(); // This gets the JSON message to be run through ObjectMapper
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); /* this is the fix */
try {
Message message = mapper.readValue(jsonMessage, Message.class);
} catch (Exception e) {
e.printStackTrace();
}
} // end method main()