JSON元素从单个更改为列表

时间:2016-05-19 18:44:36

标签: java json spring jackson

我正在使用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

1 个答案:

答案 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()