Кодовое имя: Свойство index.toJSON() не генерирует правильный JSON для списков объектов

#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. Это действительно упущение. Я рассказываю об этом в курсах/книге и пренебрегаю руководством разработчика. Это должно быть исправлено.