gpt4 book ai didi

java - 如何使用 Jackson 序列化具有嵌套负载的 Flux 风格 Action ?

转载 作者:行者123 更新时间:2023-12-02 09:18:58 25 4
gpt4 key购买 nike

我正在尝试使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com