使用抽象参数将 class 序列化为 JSON
Serialize class with abstract parameter to JSON
我有 3 个 classes:
GameResultList
基本上是 ArrayList,里面有一些辅助方法
GameResult
具有抽象值 gameMode
GameMode
public class GameResultList extends ArrayList<GameResult> {
...
}
class GameResult(
val gameMode: GameMode,
val score: Int,
timeSpentInSeconds: Int,
val completionDateTime: Date
) {
...
}
游戏模式class:
abstract class GameMode(
val suggestionsActivated: Boolean,
val screenOrientation: ScreenOrientation // enum: PORTRAIT, HORIZONTAL
) {
...
}
我需要将 GameResultList
序列化为 JSON。
由于参数gameMode
是抽象的,Gson抛出异常。经过一番研究,我决定尝试一下 Moshi。我添加了 PolymorphicJsonAdapterFactory
和 KotlinJsonAdapterFactory
,但结果总是空的 ({}
)。
我如何设置 Moshi:
private val moshi =
Moshi.Builder().add(PolymorphicJsonAdapterFactory.of(GameMode::class.java, "GameMode")
.withSubtype(GameOnTime::class.java, "GameOnTime")
.withSubtype(GameOnCount::class.java, "GameOnCount"))
.add(KotlinJsonAdapterFactory())
.build()
private val jsonAdapter: JsonAdapter<GameResultList> = moshi.adapter(GameResultList::class.java)
此 returns 空 JSON 响应:
jsonAdapter.toJson(gameResultList)
那么如何序列化 GameResultList
?有简单的方法吗?还有,不一定要用Moshi,为了方便起见,可以用别的。
经过一些调查,我发现主要问题是数组列表需要显式转换器。
class GameResultListToJsonAdapter {
@ToJson
fun arrayListToJson(list: GameResultList): List<GameResult> = list
@FromJson
fun arrayListFromJson(list: List<GameResult>): GameResultList = GameResultList(list)
}
此外,处理 Date
类型时存在问题,我已将其替换为 Long
以避免创建另一个显式转换器。
我有 3 个 classes:
GameResultList
基本上是 ArrayList,里面有一些辅助方法GameResult
具有抽象值gameMode
GameMode
public class GameResultList extends ArrayList<GameResult> {
...
}
class GameResult(
val gameMode: GameMode,
val score: Int,
timeSpentInSeconds: Int,
val completionDateTime: Date
) {
...
}
游戏模式class:
abstract class GameMode(
val suggestionsActivated: Boolean,
val screenOrientation: ScreenOrientation // enum: PORTRAIT, HORIZONTAL
) {
...
}
我需要将 GameResultList
序列化为 JSON。
由于参数gameMode
是抽象的,Gson抛出异常。经过一番研究,我决定尝试一下 Moshi。我添加了 PolymorphicJsonAdapterFactory
和 KotlinJsonAdapterFactory
,但结果总是空的 ({}
)。
我如何设置 Moshi:
private val moshi =
Moshi.Builder().add(PolymorphicJsonAdapterFactory.of(GameMode::class.java, "GameMode")
.withSubtype(GameOnTime::class.java, "GameOnTime")
.withSubtype(GameOnCount::class.java, "GameOnCount"))
.add(KotlinJsonAdapterFactory())
.build()
private val jsonAdapter: JsonAdapter<GameResultList> = moshi.adapter(GameResultList::class.java)
此 returns 空 JSON 响应:
jsonAdapter.toJson(gameResultList)
那么如何序列化 GameResultList
?有简单的方法吗?还有,不一定要用Moshi,为了方便起见,可以用别的。
经过一些调查,我发现主要问题是数组列表需要显式转换器。
class GameResultListToJsonAdapter {
@ToJson
fun arrayListToJson(list: GameResultList): List<GameResult> = list
@FromJson
fun arrayListFromJson(list: List<GameResult>): GameResultList = GameResultList(list)
}
此外,处理 Date
类型时存在问题,我已将其替换为 Long
以避免创建另一个显式转换器。