2015-05-29 141 views
0

我無法使用Google的庫'gson'庫將gson轉換爲JSON。我正在使用Java Spark Web框架,並且ResponseTransformer是Spark lib的一部分。模型參數變量可以是任何POJO。將gson轉換爲JSON

public class JsonTransformer implements ResponseTransformer { 

    private Gson gson = new Gson(); 

    @Override 
    public String render(Object model) { 

     String json = null; 
     if (model instanceof java.util.List) { 
      model = ((java.util.List) model).get(0); 
     } 
     try { 
      json = gson.toJson(model); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      System.exit(5); 
     } 

     return json; 
    } 
} 

當model是List對象時,gson庫在轉換/序列化爲json String時遇到了一些問題。

因此,這只是一個快速修復嘗試調試此:我試圖重新分配模型的第一個元素的模型列表,如果模型是一個List的實例。所以這更像是一個基本的Java問題......當我嘗試重新分配模型給模型的第一個元素時,Java不會讓這種情況發生。爲什麼?

另外,如果有人知道爲什麼gson在這種情況下失敗了,請LMK。這不應該發生。沒有明顯的無限遞歸發生。

爲了證明這一點,這裏是內容:

enter image description here

我得到一個無限遞歸堆棧跟蹤,但:。

java.lang.StackOverflowError的 在com.google.gson.internal $ Gson $ Types.resolve($ Gson $ Types.java:375) at com.google.gson.internal。$ Gson $ Types.resolve($ Gson $ Types.java:380) at com.google.gson.internal 。$ Gson $ Types.resolve($ Gson $ Types.java:375) at com.google.gson.internal。$ Gson $ Types.resolve($ Gson $ Types.java:380) at com.google.gson.internal。$ Gson $ Types.resolve($ Gson $ Types.java:375) at com.google.gson.internal 。$ Gson $ Types.resolve($ Gson $ Types.java:380) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ 1。(ReflectiveTypeAdapterFactory.java:82) at com.google.gson.internal.bind .ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81) 在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118) 在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory .java:72) at com.google.gson.Gson.getAdapter(Gson.java:356) at com.google.gson.internal.bind.ReflectiveTypeAdapterFa ctory $ 1(ReflectiveTypeAdapterFactory.java:82) 在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81) 在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory。的java:118) 在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 在com.google.gson.Gson.getAdapter(Gson.java:356) 在com.google。 gson.internal.bind.ReflectiveTypeAdapterFactory $ 1。(ReflectiveTypeAdapterFactory.java:82) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81) at com.google.gson.internal.bind。 ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory .java:118) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) at com.google.gson.Gson.getAdapter(Gson.java:356) at com.google .gson.internal.bind.ReflectiveTypeAdapterFactory $ 1。(ReflectiveTypeAdapterFactory.java:82) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81) at com.google.gson.internal.bind 。ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) at com.google.gson.Gson.getAdapter(Gson.java:356) 在1 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $(ReflectiveTypeAdapterFactory.java:82) 在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81) 在com.google。 gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) at com.google.gson.Gson.getAdapter( Gson.java:356)

我試圖從一個POJO到JSON轉換的對象是這樣的:

public class Model { 

    private String id; 
    private String title; 
    private boolean done; 
    private Date createdOn; 

    public Model(BasicDBObject dbObject) { 
     this.id = ((ObjectId) dbObject.get("_id")).toString(); 
     this.title = dbObject.getString("title") == null ? "placeholder title" : dbObject.getString("title"); 
     this.done = ((Boolean)dbObject.getBoolean("done")) == null ? false : dbObject.getBoolean("done"); 
     this.createdOn = dbObject.getDate("createdOn") == null ? new Date() : dbObject.getDate("createdOn"); 
    } 
} 
+0

你能分享異常嗎? – zengr

+0

肯定會將它添加到問題 –

+0

似乎有某種問題,其中程序試圖將模型的id字段設置爲一個ArrayList而不是一個字符串......這很奇怪 –

回答

1

你的問題是與BasicDBObject是一個默認的構造函數的參數。 Gson不喜歡它。刪除它,它會工作。閱讀:https://sites.google.com/site/gson/gson-user-guide#TOC-Writing-a-Deserializer

+0

是的,但是我可以用什麼來替代BasicDBObject? –

+1

只是重載沒有參數的no-op構造函數。如果你真的想強制gson使用該構造函數,那麼你需要使用自定義的JsonDeserializer並使用gson註冊。 – zengr

+0

@AlexMills如果解決方案爲您工作,那麼請您選擇正確的答案。 – zengr