Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Jackson序列化具有嵌套负载的Flux样式动作?_Java_Json_Kotlin_Jackson - Fatal编程技术网

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

Java 如何使用Jackson序列化具有嵌套负载的Flux样式动作?,java,json,kotlin,jackson,Java,Json,Kotlin,Jackson,我正在尝试为“通量标准动作”设置自定义序列化 JSON示例: { 键入:“ADD_TODO”, 有效载荷:{ 文字:“做点什么。” } } 我已尝试使用@JsonSubTypes声明一个接口: @JsonTypeInfo(use=JsonTypeInfo.Id.NAME,include=JsonTypeInfo.As.PROPERTY,PROPERTY=“type”) @JsonSubTypes( JsonSubTypes.Type(值=AddTodoAction::class) ) 界面作用

我正在尝试为“通量标准动作”设置自定义序列化

JSON示例:

{
键入:“ADD_TODO”,
有效载荷:{
文字:“做点什么。”
}
}
我已尝试使用
@JsonSubTypes
声明一个接口:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME,include=JsonTypeInfo.As.PROPERTY,PROPERTY=“type”)
@JsonSubTypes(
JsonSubTypes.Type(值=AddTodoAction::class)
)
界面作用
@JsonTypeName(“添加待办事项”)
数据类AddTodoAction(
val文本:字符串
):行动
以及编写自定义序列化程序:

class ActionSerializer(clazz:KClass):StdSerializer(clazz.java){
重写有趣的序列化(值:T,gen:jsonggenerator?,提供程序:SerializerProvider?){
// ??
}
用类型重写(
值:T?,
gen:JsonGenerator?,
序列化程序:SerializerProvider?,
TypeSerializer:TypeSerializer?
) {
检查(gen!=null)
检查(序列化程序!=null)
如果(值==null){
serializers.defaultSerializeNull(gen)
返回
}
val typeId=typeSer!!.typeId(值,JsonToken.START\u对象)
typeSer.writeTypePrefix(gen,typeId)
gen.writeFieldName(“有效负载”)
序列化(值、生成、序列化器)
typeSer.writeTypeSuffix(gen,typeId)
}
}

这里的问题是,我不知道如何编写
序列化
函数而不引起无限递归。我甚至不确定这是不是最好的方法。有什么建议吗?我不想写一些粗制滥造的东西,也不想为每个
有效负载
尝试
gson
JsonDeserializer,以获得现成的基本接口 而且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
    }

}
fun main(args:Array){
val gson=GsonBuilder().registerTypeAdapter(TodoAction::class.java,TodoActionSerializer())
.create()
val jsonString=“{type:'ADD_TODO',负载:{text:'Do something.}”
val todoAction=gson.fromJson(jsonString,todoAction::class.java)
打印(todoAction)
}
类TodoAction(
val类型:String,
val有效负载:JsonObject
)
类TodoActionSerializer:JsonSerializer{
重写有趣的序列化(p0:TodoAction?、p1:Type?、p2:JsonSerializationContext?):JsonElement{
val response=JsonObject()
response.addProperty(“type”,p0!!.type)
响应.添加(“有效载荷”,p0.有效载荷)
返回响应
}
}

通过修改gson解决此问题。