2016-10-26 21 views
0

行,所以我有以下的Json POJO的:的Android科特林莫希定製的Json適配器

data class JCategory(
     val id: Int, 
     val name: String, 
     val image: String?, 
     val color: String?, 
     val categories: List<JCategory>?, 
     val products: List<JProduct>? 
) 

,我想編寫一個海關解串器,因此最終的對象將是這樣的:

data class Category(
     val id: Int, 
     val name: String, 
     val image: String?, 
     val color: String?, 
     val list: List<Any> 
) 

基本上,映射是:

  • JCategory -> Category

  • JProduct -> Prod1/Prod2基於內部JProduct

一些值JCategory兩個列表將是聯合成1,其中將包含更多JCategory加PROD1/Prod2的。

這是根據Moshi在此適配器中映射數據的有效方法嗎?

@FromJson fun fromJson(category: JCategory): CategoryProduct {  

     val prods = category.products 
     val cats = category.categories 

     val list = mutableListOf<Any>() 

     if (prods != null && prods.size > 0) { 
      prods.forEach { 
       list.add(if (it.isMain == 1) { 
        P1(
          ... 
        ) 
       } else { 
        P2(
          ... 
        ) 
       }) 
      } 
     } 

     if (cats != null && cats.size > 0){ 
      cats.forEach { 
       list.add(fromJson(it)) 
      } 
     } 

     return CategoryProduct(
       category.id, 
       category.name, 
       category.image.emptyToNull(), 
       parsedColor, 
       category.parentId, 
       list 
     ) 
    } 

請注意,我有一個JCategory和相同對象的名單內, 所以我想適配器會自動解析這一點,但事實並非如此。所以我嘗試list.add(fromJson(it)),它的工作。

所以我的問題是:

  • list.add(fromJson(it))處理這樣的情況下正確的方法是什麼?
  • 如何根據其中的某些屬性將對象映射到另一個/ other? fromJson只能返回1種類型的轉換對象。

回答

0

我覺得,遞歸是正確的處理方式list(add(fromJson(it)),主要問題是裏面的結構。結構本身是遞歸的。正確的方法是扁平結構&引用另一個對象類型。

關於第二,這也是一個結構不好的問題。你可以通過繼承來解決這個問題。然後檢查目標類型本身。

interface X { } 
data class A : X { } 
data class B : X { } 
@FromJson fun fromJson(json: C): X { }