Используйте Gson для сериализации POJO - PullRequest
6 голосов
/ 12 марта 2012

Я использую GSON serialize POJO - как объект до, так и после изменения.

Измененный (назовите его A), который настроен Struts2, можно легко сериализовать в Json.

В то время как POJO перед изменением, которое получают из базы данных через iBatis (назовите его B), не может быть сериализовано

В сообщении об ошибке написано: Забыли ли вы зарегистрировать адаптер типа?

Я прочитал API Gson. Но я не думаю, что регистрация адаптера типа для каждого POJO - хорошая идея. Что делает серию B невозможной?

Я пишу clone () для моего POJO, и объект, клонированный из B, также может быть выполнен.

Это сбивает с толку ... Кто-нибудь может мне ответить?

перед изменением (клон Б):

{"id":"6429B5329C544711A9848AF243D10E4E","idType":"未选择","firstDate":"Feb 29, 2012 12:00:00 AM","name":"testetes","gender":"男","phone":"553223","city":"未选择","ocup":"未选择","nation":"未选择","famStru":"未选择","infSouc":"未选择","creater":"EE4783A6272A4B62A5CC68DB3C11FE1E","createDate":"Feb 29, 2012 12:00:00 AM","purpose":"未选择","education":"未选择","income":"未选择","cars":"未选择","acptCarpRent":"未选择","acptCarpPrice":"未选择","handStand":"未选择","intentHouse":"未选择","intentArea":"未选择","intentLayout":"未选择","nextDate":"Mar 7, 2012 12:00:00 AM","wuyeType":"未选择","attentionPro":"958B9E093A84415B901900C2DA25C712","ordinaryTraffic":"未选择","attentionPoint":"未选择","buyDate":"未选择","cityArea":"未选择","lastUpdate":"Feb 29, 2012 12:00:00 AM","lastModifier":"EE4783A6272A4B62A5CC68DB3C11FE1E","saler":"A4FB4877DC2945E980477544A955B57F","state":"意向","status":"0"}

После изменения (A):

{"id":"6429B5329C544711A9848AF243D10E4E","idType":"未选择","firstDate":"Feb 29, 2012 12:00:00 AM","visitMode":"","name":"testetes","gender":"男","telPhone":"","phone":"553223","fax":"","adrs":"","postCode":"","email":"","workUnit":"","city":"未选择","media_id":"","ocup":"未选择","idNum":"","nation":"未选择","famStru":"未选择","infSouc":"未选择","createDate":"Feb 29, 2012 12:00:00 AM","idAdr":"","purpose":"未选择","education":"未选择","income":"未选择","cars":"未选择","acptCarpRent":"未选择","acptCarpPrice":"未选择","handStand":"未选择","intentHouse":"未选择","intentArea":"未选择","intentLayout":"未选择","customerDetail":"","wuyeType":"未选择","attentionPro":"958B9E093A84415B901900C2DA25C712","ordinaryTraffic":"未选择","attentionPoint":"未选择","buyDate":"未选择","cityArea":"未选择","lastUpdate":"Mar 11, 2012 2:58:04 PM","lastModifier":"00000000000000000000000000000000","saler":"A4FB4877DC2945E980477544A955B57F","state":"意向"}

Ответы [ 2 ]

10 голосов
/ 13 июля 2012

Похоже, ваш POJO относится к типу Customer? Когда вы клонируете свой объект, вы создаете нового Customer, и Gson может его сериализовать просто отлично. Однако когда вы выбираете тот же объект из БД, это не стандартный объект Customer. Вместо этого это подкласс, который включает некоторую информацию о постоянстве, такую ​​как класс объекта.

Вероятно, самое простое решение - использовать аннотацию Gson @Expose. Если вы создаете свой объект Gson с new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(), то вы можете пометить каждое из полей Customer, которое вы хотели бы сериализовать, с помощью @Expose. Любые другие поля, включая поля подкласса вашей персистентной платформы, не будут сериализованы.

2 голосов
/ 13 июня 2016

Брэндон был прав. Вот еще одно решение, если вы не хотите использовать какие-либо аннотации или изменять свой класс POJO. Это может помочь другим парням.

Type typeOfSrc = new TypeToken<A>() {}.getType(); //this helps for generic one.
gson.toJson(obj, typeOfSrc); or gson.toJson(obj, A.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...