2012-03-09 35 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(); 

但我認爲我'做錯了什麼,因爲這個代碼拋出以下異常:

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()只接受StringReader對象,你傳遞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

好吧,我試過第二個解決方案,但它並不真正的工作。調用add()總是導致「無法序列化類java.lang.Object」。所以我現在正在使用類似「中間方式」的東西..一個具有與我的模型相同的屬性的「翻譯」對象 - 我使用這個對象來填充json數據,然後創建一個基於該對象的模型。 ..對我來說很有效...也許不是最好的/優雅的方式 - 但是現在它的工作。 – Marc 2012-03-10 21:37:03

+0

無論如何,關於JsonObject-> toJson的提示很有用。 – Marc 2012-03-10 21:47:12