Android Kotlin Moshi 自定义 Json 适配器
Android Kotlin Moshi Custom Json Adapter
好的,所以我有以下 Json Pojo:
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))
处理此类案件的正确方法吗?
- 我如何根据其中的某些 属性 将一个对象映射到另一个 one/other? fromJson 只能return 1 种转换对象。
我认为,递归是正确的处理方式list(add(fromJson(it))
,主要问题出在结构内部。结构本身是递归的。正确的方法是展平结构并引用另一个 object 类型。
关于第二个,这也是结构不好带来的问题。您可以通过继承通过 common parent 来解决这个问题。然后检查目标类型本身。
interface X { }
data class A : X { }
data class B : X { }
@FromJson fun fromJson(json: C): X { }
好的,所以我有以下 Json Pojo:
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))
处理此类案件的正确方法吗? - 我如何根据其中的某些 属性 将一个对象映射到另一个 one/other? fromJson 只能return 1 种转换对象。
我认为,递归是正确的处理方式list(add(fromJson(it))
,主要问题出在结构内部。结构本身是递归的。正确的方法是展平结构并引用另一个 object 类型。
关于第二个,这也是结构不好带来的问题。您可以通过继承通过 common parent 来解决这个问题。然后检查目标类型本身。
interface X { }
data class A : X { }
data class B : X { }
@FromJson fun fromJson(json: C): X { }