예,이 같은 layerType
에 따라 JSON을 구문 분석 할 수있는 사용자 정의 형 어댑터를 만들 수 있습니다
다음
class LayerAdapter {
@FromJson
fun fromJson(layerJson: LayerJson): Layer = when (layerJson.layerType) {
LayerType.SHAPE -> ShapeLayer(layerJson.layerType, layerJson.shape ?: "")
LayerType.TEXT -> TextLayer(layerJson.layerType, layerJson.text ?: "")
LayerType.IMAGE -> ImageLayer(layerJson.layerType, layerJson.image ?: "")
}
@ToJson
fun toJson(layer: Layer): LayerJson = when (layer) {
is ShapeLayer -> LayerJson(layer.type, shape = layer.shape)
is TextLayer -> LayerJson(layer.type, text = layer.text)
is ImageLayer -> LayerJson(layer.type, image = layer.image)
else -> throw RuntimeException("Not support data type")
}
}
나는 각각 선명도에 대한 데이터 클래스 일부 변경 (추가 특성을 가지고 Layer
유형, ShapeLayer
예 : shape
) :
sealed class Layer
data class ShapeLayer(val type: LayerType, val shape: String) : Layer()
data class TextLayer(val type: LayerType, val text: String) : Layer()
data class ImageLayer(val type: LayerType, val image: String) : Layer()
//LayerJson contains every possible property of all layers
data class LayerJson(val layerType: LayerType, val shape: String? = null, val text: String? = null, val image: String? = null) : Layer()
enum class LayerType {
SHAPE, TEXT, IMAGE
}
테스트 코드 :
val moshi = Moshi.Builder()
.add(LayerAdapter())
.build()
val type = Types.newParameterizedType(List::class.java, Layer::class.java)
val adapter = moshi.adapter<List<Layer>>(type)
//Convert from json string to List<Layer>
val layers: List<Layer>? = adapter.fromJson("""
[
{"layerType":"SHAPE", "shape":"I am rectangle"},
{"layerType":"TEXT", "text":"I am text"},
{"layerType":"IMAGE", "image":"I am image"}
]
""".trimIndent())
layers?.forEach(::println)
//Convert a list back to json string
val jsonString: String = adapter.toJson(layers)
println(jsonString)
출력 :
ShapeLayer(type=SHAPE, shape=I am rectangle)
TextLayer(type=TEXT, text=I am text)
ImageLayer(type=IMAGE, image=I am image)
[{"layerType":"SHAPE","shape":"I am rectangle"},{"layerType":"TEXT","text":"I am text"},{"image":"I am image","layerType":"IMAGE"}]
편집 : 당신이 Layer
가 포함 된 다른 개체를 구문 분석하려고 할 때 당신은 평소와 같이 어댑터를 추가 할 수 있습니다. 이 같은 객체가 있다고 가정 :
data class LayerContainer(val layers: List<Layer>)
테스트 코드 :
val moshi = Moshi.Builder()
.add(LayerAdapter())
.build()
val adapter = moshi.adapter(LayerContainer::class.java)
val layerContainer: LayerContainer? = adapter.fromJson("""
{
"layers": [
{"layerType":"SHAPE", "shape":"I am rectangle"},
{"layerType":"TEXT", "text":"I am text"},
{"layerType":"IMAGE", "image":"I am image"}
]
}
""".trimIndent())
layerContainer?.layers?.forEach(::println)
val jsonString: String = adapter.toJson(layerContainer)
println(jsonString)
'@ ToJson' 메서드가 누락되었다고 생각합니까? 아래의 답변은 정확합니다. –
@ToJson이 없습니다. 예를 들어 – miszmaniac
흠에 대해 중요하지 않다고 생각했던 코드는 모두 건너 뛰었습니다.이 코드는 대답과 동일하게 보입니다. 그걸 작동 시켰 니? –