Я пытаюсь преобразовать строку JSON в класс модели. Я использую морфию в рамках игры.Playframework, преобразование JSON в модель (с помощью Gson), сбой модели сохранения
Вот соответствующие строки кода:
public static void add(JsonObject body) {
System.out.println(body); // -> {"title":"test2","url":"http://www.gmx.de","description":"eine beschreibung für das lesezeichen","tags":["tag1","tag2","tag3","tag5","tag0209135913598"],"is_private":true}
Gson gson = new Gson();
Bookmark bookmark = gson.fromJson(body, Bookmark.class);
System.out.println(bookmark.getClass().getName()); // -> models.Bookmark
bookmark.save();
Но я думаю, что I'am делает что-то не так, потому что этот код выдает следующее исключение:
Execution exception (In /app/controllers/Bookmarks.java around line 40)
IllegalArgumentException occured : can't serialize class java.lang.Object
play.exceptions.JavaExecutionException: can't serialize class java.lang.Object
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:231)
at Invocation.HTTP Request(Play!)
Caused by: java.lang.IllegalArgumentException: can't serialize class java.lang.Object
at org.bson.BSONEncoder._putObjectField(BSONEncoder.java:234)
at org.bson.BSONEncoder.putIterable(BSONEncoder.java:259)
at org.bson.BSONEncoder._putObjectField(BSONEncoder.java:198)
at org.bson.BSONEncoder.putObject(BSONEncoder.java:140)
at org.bson.BSONEncoder.putObject(BSONEncoder.java:86)
at com.mongodb.OutMessage.putObject(OutMessage.java:190)
at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:253)
at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:217)
at com.mongodb.DBCollection.insert(DBCollection.java:71)
at com.mongodb.DBCollection.save(DBCollection.java:633)
at com.google.code.morphia.DatastoreImpl.save(DatastoreImpl.java:764)
at com.google.code.morphia.DatastoreImpl.save(DatastoreImpl.java:826)
at com.google.code.morphia.DatastoreImpl.save(DatastoreImpl.java:820)
at play.modules.morphia.Model.save2(Model.java:705)
at play.modules.morphia.Model.save(Model.java:692)
at controllers.Bookmarks.add(Bookmarks.java:40)
at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:548)
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:502)
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:478)
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:473)
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161)
... 1 more
Похоже, что следующая линия выбрасывает это исключение:
bookmark.save();
Вот код модели:
@AutoTimestamp
@Entity
public class Bookmark extends Model {
public String title;
public String url;
public String description;
@Indexed
public List tags;
public boolean is_private;
public Bookmark() {}
public Bookmark(String title,
String url,
String description,
List tags,
boolean is_private)
{
this.title = title;
this.url = url;
this.description = description;
this.tags = tags;
this.is_private = is_private;
}
}
Мой вопрос в том, как я могу это исправить, или как я должен создать экземпляр модели, основанный на входе JSon?
Хорошо, я попробовал второе решение, но это не работает. Вызовы для добавления() всегда приводили к «невозможно сериализовать класс java.lang.Object». Поэтому я теперь использую что-то вроде «среднего пути» .. объект «перевода» с теми же атрибутами, что и моя модель, - я использую этот объект, чтобы заполнить его данными json, а затем создаю модель на основе этого объекта. .. это работает для меня ... может быть, не лучший/элегантный способ, но на данный момент это работает. – Marc
В любом случае, ваш отзыв о JsonObject-> toJson был полезен. – Marc