Mat*_*ein 6 java json jackson kotlin amazon-dynamodb
我正在尝试使用 Jackson 序列化/反序列化DynamoDB V2 AttributeValue类。
它被设置为带有构建器的不可变类,并且构建器有一个私有构造函数。为了创建构建器,您需要调用AttributeValue.builder().
我无法控制这个类,所以我想使用 Jackson mixin。
我已经使用@JsonDeserialize(builder = AttributeValue.Builder::class)并注册了 mixin:
@JsonDeserialize(builder = AttributeValue.Builder::class)
interface AttributeValueMixin {
}
private val mapper = jacksonObjectMapper()
.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY)
.addMixIn(AttributeValue::class.java, AttributeValueMixin::class.java)
Run Code Online (Sandbox Code Playgroud)
然而,Jackson 试图使用 的默认构造函数,AttributeValue.Builder但它不能,因为它没有。
com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造实例
software.amazon.awssdk.services.dynamodb.model.AttributeValue$Builder(不存在创建者,如默认构造)
如何让 Jackson 使用AttributeValue.builder()工厂功能?或者关于如何使用 Jackson 序列化/反序列化此类的任何其他想法AttributeValue?
所以这感觉完全是 jankey,但它有效,所以... \xc2\xaf\\ (\xe3\x83\x84) /\xc2\xaf
\n对于我的情况,我需要序列化/反序列化Map<String, AttributeValue>,因此我使用了一种技术,将映射的 JSON 版本填充到“map”属性中,反序列化,然后提取“map”值:
import com.fasterxml.jackson.databind.ObjectMapper\n\n// the Jackson mapper\nval mapper = ObjectMapper()\n // I don't remember if this was needed, but I assume so...\n .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY)\n // This is probably just to make the JSON smaller\n .setSerializationInclusion(JsonInclude.Include.NON_EMPTY)\n\n// to JSON\nval dynamoAttributes: Map<String, AttributeValue> = ... \nval attributesAsJson = mapper.writeValueAsString(dynamoAttributes)\n\n// read back from JSON\nval result: Map<String, AttributeValue> =\n mapper.readValue(\n """{"m":$attributesAsJson}""", // stuff the JSON into a map field\n AttributeValue.serializableBuilderClass())\n .build()\n .m() // extract the "strongly" typed map\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1131 次 |
| 最近记录: |