如何使用Jackson的嵌套有效负载序列化Flux样式的动作?

时间:2019-11-12 20:14:08

标签: java json kotlin jackson

我正在尝试使用jackson为“助焊剂标准操作”设置自定义序列化。

示例JSON:

{
  type: 'ADD_TODO',
  payload: {
    text: 'Do something.'  
  }
}

我尝试通过声明@JsonSubTypes的接口:

@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函数而不会引起无限递归。我什至不确定这是最好的方法。有什么建议么?我不想写些骇人听闻的东西,也不想为每个payload都有一个单独的类。

1 个答案:

答案 0 :(得分:1)

为开箱即用的基本接口

尝试<rule name="Rewrite" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{URL}" negate="true" pattern="isABC" /> </conditions> <action type="Rewrite" url="localhost55717/product/xyz.aspx" /> </rule> <rule name="Rewrite" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{URL}" pattern="isABC" /> </conditions> <action type="Redirect" url="localhost55717/product/xyz.aspx" redirectType="Permanent" /> </rule> JsonDeserializer 而且JsonSerializer非常易于实现,而且记录也很丰富

gson