我正在尝试使用 jackson 设置自定义序列化对于“通量标准操作”。
JSON 示例:
{
type: 'ADD_TODO',
payload: {
text: 'Do something.'
}
}
我尝试使用 @JsonSubTypes
声明一个接口(interface):
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes(
JsonSubTypes.Type(value = AddTodoAction::class)
)
interface Action
@JsonTypeName("ADD_TODO")
data class AddTodoAction(
val text: String
) : Action
并编写自定义序列化器:
class ActionSerializer<T : Any>(clazz: KClass<T>) : StdSerializer<T>(clazz.java) {
override fun serialize(value: T, gen: JsonGenerator?, provider: SerializerProvider?) {
// ??
}
override fun serializeWithType(
value: T?,
gen: JsonGenerator?,
serializers: SerializerProvider?,
typeSer: TypeSerializer?
) {
check(gen != null)
check(serializers != null)
if (value == null) {
serializers.defaultSerializeNull(gen)
return
}
val typeId = typeSer!!.typeId(value, JsonToken.START_OBJECT)
typeSer.writeTypePrefix(gen, typeId)
gen.writeFieldName("payload")
serialize(value, gen, serializers)
typeSer.writeTypeSuffix(gen, typeId)
}
}
这里的问题是我不知道如何编写serialize
函数而不导致无限递归。我什至不确定这是最好的方法。有什么建议么?我不想写一些黑客的东西,也不想为每个有效负载
都有一个单独的类。
最佳答案
尝试 gson
JsonDeserializer 以获得开箱即用的基本接口(interface)
并且 JsonSerializer 非常容易实现,也有很好的文档记录
fun main(args: Array<String>) {
val gson = GsonBuilder().registerTypeAdapter(TodoAction::class.java, TodoActionSerializer())
.create()
val jsonString = "{type: 'ADD_TODO',payload: {text: 'Do something.'}}"
val todoAction = gson.fromJson(jsonString, TodoAction::class.java)
print(todoAction)
}
class TodoAction(
val type: String,
val payload: JsonObject
)
class TodoActionSerializer : JsonSerializer<TodoAction> {
override fun serialize(p0: TodoAction?, p1: Type?, p2: JsonSerializationContext?): JsonElement {
val response = JsonObject()
response.addProperty("type", p0!!.type)
response.add("payload", p0.payload)
return response
}
}
关于java - 如何使用 Jackson 序列化具有嵌套负载的 Flux 风格 Action ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58826020/