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

标签 java json kotlin jackson

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

相关文章:

java - 如何向表单提交帖子请求?

Java 面板向下滚动

java - 对于类中的方法,哪种 OOP 设计更好

jquery - 全日历在移动中改变颜色

php - 我需要对 json_encoded 对象进行 escape_string 吗?

iphone - 带有 bool 值的 AFNetworking JSON 请求

android - 使用 Kotlin 在 Android Studio 中将 URI 的内容转换为 ByteArray

Java将方法存储到数组列表中

android - 带有 Kotlin 的 Android 中的 HTTP 请求

java - 将数据模型映射到域模型的简单方法