2016-05-19 2 views
0

Я использую 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

+1

http://stackoverflow.com/questions/37164399/jackson-desrialize- когда-jsonproperty-это-иногда-массива и, иногда-а-сингл-о/37175527 # 37175527 – varren

ответ

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() 
Смежные вопросы