2017-06-06 29 views
1

解析重用已經實例化對象我使用GSON庫來解析具有以下結構的JSON對象:通過GSON

{ 
    "data" : [ 
     { 
      "id" : 1, 
      "type" : "student", 
      "name" : "Student 1", 
      "subjects" : [ 
       { 
        "id": 1, 
        "type" : "subject" 
       } 
      ] 
     }, 
     { 
      "id" : 2, 
      "type" : "student", 
      "name" : "Student 2", 
      "subjects" : [ 
       { 
        "id": 1, 
        "type" : "subject", 
        "name" : "Math" 
       } 
      ] 
     }, 
     { 
      "id" : 3, 
      "type" : "office", 
      "name" : "student 3", 
      "subjects" : [ 
       { 
        "id": 1, 
        "type" : "subject", 
        "name" : "History" 
       }, 
       { 
        "id": 2, 
        "type" : "subject", 
        "name" : "History" 
       } 
      ] 
     } 
    ] 
} 

這是一個非常簡單的例子,有3名學生誰協助爲0或很多班。正如你所看到的,2個或更多的學生可以有一個特定的主題相同的引用,但是當我解析對象時,學生1將有一個主題1的對象,學生2將有一個不同的對象,但具有相同的信息學生1,所以我的問題基本上是,有沒有辦法重用已經創建的對象?在這種情況下,有多個引用不是問題,但是說你有更多的對象,這將變成一個內存問題。

理論上想到的是,在創建一個對象實例之前,應該有某種類型的池,所以我使用id和type,如果找到了我返回的對象,否則我讓解析器去爲我創建實例。有JsonDeserializer接口,但是使用JSON反序列化上下文存在一個已知問題,我也不能只在它內部做一個新的Gson(),因爲我的主Gson有一些我想要重用的反序列化器和策略。我可以重新創建gson,但我不認爲這是理想的,應該有更好的方法。另外,我已經有了一個TypeAdapter,它最初對來自服務器的JSON進行了預處理,基本上它刪除了一些屬性並在示例中添加了一些其他屬性,但是我無法檢查每個單獨的對象,如JsonDeserializer會做

我會很感激任何幫助或想法。

+0

您的主題共享不同類別的相同ID。您的示例數據中是否存在拼寫錯誤? +辦公室也是一個錯字嗎? –

+0

@LyubomyrShaydariv對不起,這是一個錯字 –

回答

0

你可以做的一種方法是通過展平結構。即可以跳過發送學生對象中的整個主題對象。

例如,一個學生對象:

"student": [ 
    { 
     id: "1234567890", 
     name: "Bhalchandra Wadekar", 
     subject: [ 
      "CS4040", 
      "CS4010" 
     ] 
    } 
] 

其中,CS40​​40和CS4010是個體對象的標識符。

主題對象:

"subject": [ 
    { 
     id: "CS4040", 
     name: "Mobile Design and Development" 
    }, 
    { 
     id: "CS4010", 
     name: "Major Project" 
    } 
] 

使用這種方法的好處是:

  1. 減少數據的你個人請求導致更快的響應時間接收的量。
  2. 內存中的每個主題的單個對象。因此,無論有多少學生協助該主題,您都將創建並使用一個對象。
+0

這實際上是服務器返回的,但基本上我需要添加一個函數來搜索每種類型,當我需要它們時,這會增加代碼的複雜性,每當我傳遞我需要添加代碼以查找實際對象的參考數組 –

+0

地圖可以解決尋找給定標識符的主題的問題。 :) – BhalchandraSW