#codenameone
Вопрос:
У меня есть мобильное приложение, в котором пользователь заполняет форму, скажем, событие, и при сохранении я хочу отправить данные в формате JSON на сервер. CN1 имеет возможность легко генерировать JSON с помощью PropertyBusinessObject, поэтому мое событие определяется следующим образом:
public class Event implements PropertyBusinessObject {
public final Property<Long, Event> eventId = new Property<>("eventId");
public final Property<EventLocation, Event> eventLocation = new Property<>("eventLocation", EventLocation.class);
public final Property<List<EventItinerary>, Event> eventItineraryList = new Property<>("eventItineraryList", XXX);
private final PropertyIndex idx...
}
И EventLocation, и eventinerary реализуют PropertyBusinessObject, и я обнаружил, что при создании JSON для события EventLocation генерирует нормально, но не eventinerary. Когда я пытаюсь использовать EventItinerary.class в разделе «XXX» выше я получаю следующую ошибку…
Exception: java.lang.ClassCastException - class java.util.ArrayList cannot be cast to class com.codename1.properties.PropertyBusinessObject
что происходит в строке 484 файла com.codename1.properties.PropertyIndex.toMapRepresentationImpl()
Когда я использую List.class для «XXX» или ничего, т. е. нового свойства<>(«eventinerarylist»); затем он отправляется на сервер, но JSON содержит имя класса и его адрес памяти, т. е.
{
"eventId": 3425567,
"eventLocation" : {
...
},
"eventItineraryList": [
"com.myapp.event.EventItinerary@cdc543c",
"com.myapp.event.EventItinerary@39987ocb",
"com.myapp.event.EventItinerary@cd5t776c",
]
}
Мой вопрос в том, что я должен поместить в «XXX», чтобы объекты Eventinerary имели правильное представление JSON?
Ответ №1:
Вам нужно использовать a ListProperty
, чтобы мы могли перейти к нему, и ListProperty
оно должно относиться к другому PropertyBusinessObject
. Так что это должно выглядеть примерно так:
public final ListProperty<EventItinerary, Event> eventItineraryList = new ListProperty<>("eventItineraryList", EventItinerary.class);
Обратите EventItinerary.class
внимание на то, что важно. Общие значения теряются из-за стирания. Аргумент позволяет нам реконструировать объект с помощью правильных типов объектов при загрузке из JSON.’
Кроме того, опять же, для того, чтобы это сработало EventItinerary
, должно быть PropertyBusinessObject
слишком.
Комментарии:
1. Спасибо, Шай. Не видел примера в руководстве разработчика и пропустил его в API — смотрел на вещи с именем PropertyXXX…
2. Это действительно упущение. Я рассказываю об этом в курсах/книге и пренебрегаю руководством разработчика. Это должно быть исправлено.