Я использую Java Spring с Jackson для использования данных JSON с веб-службы партнера, и я столкнулся с проблемой, с которой мне трудно справиться. Проблема в том, что иногда данные, которые мне нужно потреблять, содержат один элемент определенного типа, и иногда данные включают в себя полный список этих элементов (пожалуйста, простите меня, если я не использую здесь правильные условия 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 Beans, и вот мои два бобы:
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()
Когда я выполняю этот код при получении сообщения в формате JSON с одним элементом «деятельности», она работает. При выполнении его со списком элементов «деятельности», я получаю следующее сообщение об ошибке:
com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.graybar.utilities.parsejson.Activity out of START_ARRAY token
Изменения боба сообщений к следующему делает код работать при работе со списком элементов «деятельности»:
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
я должен представить себе, что есть простой способ справиться с одинарным или списком экземпляров элемента в рамках Джексона, но, к сожалению, я не смог найти его.
Любая помощь приветствуется!
-Stephen Spalding
http://stackoverflow.com/questions/37164399/jackson-desrialize- когда-jsonproperty-это-иногда-массива и, иногда-а-сингл-о/37175527 # 37175527 – varren