Десериализовать коллекцию java-генериков с помощью json - PullRequest
1 голос
/ 24 марта 2011

Я пытаюсь сериализовать и десериализовать ответ из спящего режима.
почти успешно.
Сначала я получаю данные (объект DealBean) из БД, используя

Collections.checkedList(session.createCriteria(DealBean.class).add(Restrictions.eq("account", account)).list(), DealBean.class);

затем я сериализую его (используя gson) и отправляю результат клиенту.

в клиенте я пытаюсь десериализовать его, используя

Type type = new TypeToken<Collection<DealBean>>(){}.getType();
    List<DealBean> dealsForAccount = (List<DealBean>)Json.from(SomeAnswerString);

сейчас - я получаю JsonParseException. Я думаю, что список, возвращаемый из спящего режима, является другим типом java.util.Collections $ CheckedRandomAccessList Я получаю следующее исключение (ниже). 1. какие-либо предложения? 2. правильно ли я выбираю? Могу ли я привести результат на сервере?

JsonParseException: JsonDeserializer com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter@a17378 не удалось десериализовать объект json {"type": "java.util.Collections $ CheckedRandomAccessList", "content": "[{\ \ ID" : 5, \ "обращающийся \": {\ "идентификатор \": 5, \ "tradableName \": \ "Tradable1 \", \ "банковский мультипликатор \": 1}, \ "Действие \": \ "купить \" \ "количество \": 501,0, \ "цены \": 50,3, \ "портфель \": {\ "ID \": 2, \ "portfolioName \": \ "Portfolio2 \"}, \ "счет \" : {\ "ID \": 1, \ "AccountName \": \ "account1 \", \ "банк \": {\ "ID \": 1, \ "BankName \": \ "Bank1 \"}} , \ "date \": \ "12:17:36 02/01/1970 \", \ "activitySum \": 0.0, \ "aggregated \": false}, {\ "ID \": 6, \ " обращающийся \ ": {\" идентификатор \ ": 6, \" tradableName \ ": \" Tradable1 \ "\ "банковский мультипликатор \": 1}, \ "Действие \": \ "продать \", \" количество \ ": 1001.0, \" цена \ ": 50.4 \" портфель \ ": {\" ID \ ": 2, \" portfolioName \ ": \" Portfolio2 \ "}, \" счет \ ": {\" ID \ ": 2, \" AccountName \ ": \" account2 \ "\ "банк \": {\ "ID \": 2, \ "BankName \": \ "Банк2 \"}}, \" дата \ ": \" 12:17:36 02/01/1970 \ ", \" activitySum \ ": 0.0, \" aggregated \ ": false}, {\" ID \ ": 7, \" tradable \ ": { \ "идентификатор \": 7, \ "tradableName \": \ "Tradable2 \", \ "банковский мультипликатор \": 1}, \ "Действие \": \ "купить \", \ "количество \": 502,0, \ "цены \": 50,5, \ "портфолио \": {\ "ID \": 2, \ "portfolioName \": \ "Portfolio2 \"}, \ "учетная запись \": {\ "ID \": 1, \ "AccountName \": \ "account1 \", \ "банк \ ": {\" ID \ ": 1, \" BankName \ ": \" Bank1 \ "}}, \" date \ ": \" 12:17:36 02/01/1970 \ ", \" ActivitySum \ ": 0,0, \" агрегируются \ "ложь}, {\" ID \ ": 8, \" торгуемый \ ": {\" идентификатор \ ": 8, \" tradableName \ ": \" Tradable2 \», \ "банковский мультипликатор \": 1}, \ "Действие \": \ "продать \", \ "количество \": 1002,0, \ "цена \": 50,6, \ "портфель \": {\ "ID \": 2, \ "portfolioName \": \ "Portfolio2 \"}, \ "учетная запись \": {\ "ID \": 2, \ "AccountName \": \ "account2 \", \ "банк \": {\ "ID \": 2, \ "BankName \": \ "Bank2 \"}}, \ "date \": \ "12:17:36 02/01/1970 \", \ "ActivitySum \": 0.0, \ "aggregated \": false}] "}, учитывая тип java.util.Collection на com.google.gson.JsonDeserializerExceptionWrapper.deserialize (JsonDeserializerExceptionWrapper.java:63) на com.google.gson.JsonDeserializationVisitor.invokeCustomDeserializer (JsonDeserializationVisitor.java:88) на com.google.gson.JsonDeserializationVisitor.visitUsingCustomHandler (JsonDeserializationVisitor.java:76) на com.google.gson.ObjectNavigator.accept (ObjectNavigator.java:98) на com.google.gson.JsonDeserializationContextDefault.fromJsonObject (JsonDeserializationContextDefault.java:73) на com.google.gson.JsonDeserializationContextDefault.deserialize (JsonDeserializationContextDefault.java:51) на com.google.gson.Gson.fromJson (Gson.java:495) на com.google.gson.Gson.fromJson (Gson.java:444) на com.google.gson.Gson.fromJson (Gson.java:396) at Position.server.services.PositionServerServicesInternalWrapperTest.testGetPositionsForPortfolio (PositionServerServicesInternalWrapperTest.java:134) at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) в org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:44) в org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:15) в org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java:41) в org.junit.internal.runners.statements.InvokeMethod.evaluate (InvokeMethod.java:20)в org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:76) в org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:50) в org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:193) в org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:52) в org.junit.runners.ParentRunner.runChildren (ParentRunner.java:191) в org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:42) в org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.java:184) в org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java:28) в org.junit.internal.runners.statements.RunAfters.evaluate (RunAfters.java:31) в org.junit.runners.ParentRunner.run (ParentRunner.java:236) в org.junit.runner.JUnitCore.run (JUnitCore.java:157) на com.intellij.rt.execution.junit.JUnitStarter.main (JUnitStarter.java:65) Вызывается: java.lang.IllegalStateException: это не массив JSON. на com.google.gson.JsonElement.getAsJsonArray (JsonElement.java:100) на com.google.gson.DefaultTypeAdapters $ CollectionTypeAdapter.deserialize (DefaultTypeAdapters.java:468) на com.google.gson.DefaultTypeAdapters $ CollectionTypeAdapter.deserialize (DefaultTypeAdapters.java:435) на com.google.gson.JsonDeserializerExceptionWrapper.deserialize (JsonDeserializerExceptionWrapper.java:50) ... еще 31

List<BankBean> al = new ArrayList<BankBean>();
al.add(bank1);
al.add(bank2);
String alStr = Json.toWrap(al); // 

List<BankBean> reAl;

Gson gson = new Gson();
Type type = new TypeToken<Collection<BankBean>>(){}.getType();
List<String> listFromJson = gson.fromJson(alStr,type);

Ответы [ 2 ]

2 голосов
/ 24 марта 2011

Тип java.util.Collections$CheckedRandomAccessList - это оболочка, созданная Collections.checkedList другого списка, которая гарантирует, что все добавленное в список соответствует соответствующей сигнатуре типа.Если у вас нет какого-либо способа указать, как создать вспомогательный список и тип (он же экземпляр java.lang.Class), который он должен проверять, то для его создания недостаточно информации.

Чтобы исправить это, возможно, измените "java.util.Collections$CheckedRandomAccessList" на "java.util.ArrayList" и вызовите Collections.checkedList в результате вашей десериализации с соответствующим типом защиты.

А чтобы предотвратить повторение проблемы, возможно, сделайтепосле до сериализации, если ваш список не является instanceof ArrayList<?>:

List<Object> mySerializableList = new ArrayList<Object>(myList);
0 голосов
/ 25 марта 2011

JSON у вас не похож на простую коллекцию, а скорее на bean-компонент, имеющий свойства и коллекцию.Так что это может быть необходимо изменить.Ваш JSON должен соответствовать объекту (объектам), с которым вы отображаетесь, независимо от используемой библиотеки.

И если вы не можете заставить его работать с Gson, есть другие, которые вы можете попробовать, с более мощной привязкой данныхFeatuers.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...