2012-03-09 2 views
1

Я пытаюсь преобразовать строку 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?

ответ

0

Он бросает ошибку, потому что fromJson() принимает только String или Reader объекты, вы передаете в JsonObject.

Но потому что Играйте! использует POJO binding это, вероятно, лучше сделать что-то вроде:

public static void add(Bookmark newBookmark) { 
    // Validation etc .. 
    bookmark.save(); 
} 

Если вы действительно хотите работать с Gson потом что-то подобное может работать (на основе глядя на the docs):

public static void add(JsonObject body) { 
    Gson gson = new Gson(); 
    String json = gson.toJson(body, Bookmark.class); 
    Bookmark bookmark = gson.fromJson(json, Bookmark.class); 
    bookmark.save(); 
} 
+0

Хорошо, я попробовал второе решение, но это не работает. Вызовы для добавления() всегда приводили к «невозможно сериализовать класс java.lang.Object». Поэтому я теперь использую что-то вроде «среднего пути» .. объект «перевода» с теми же атрибутами, что и моя модель, - я использую этот объект, чтобы заполнить его данными json, а затем создаю модель на основе этого объекта. .. это работает для меня ... может быть, не лучший/элегантный способ, но на данный момент это работает. – Marc

+0

В любом случае, ваш отзыв о JsonObject-> toJson был полезен. – Marc