java - Dyanmodb 增强客户端嵌套对象为 json
问题描述
我有嵌套对象(组合)用于表示我想要存储的数据,并使用 Dyanmodb 增强客户端作为 AWS Java 版本 2 api 的一部分。在自述文件中,它解释了如何展平对象。在 api 的版本之一中,能够将对象列表作为 json 文档存储在 dyanmodb 中。
public class Customer{
private String name;
private List<GenericRecord> recordMetadata;
//getters and setters for all attributes
}
public class GenericRecord {
private String id;
private String details;
//getters and setters for all attributes
}
希望它按以下方式存储,而不是为了向后兼容而展平:
{
"name": "ABC",
"recordMetadata": [
{
"id":"123",
"details":"hello"
},
{
"id":"456",
"details":"yellow"
}
]
}
https://github.com/aws/aws-sdk-java-v2/blob/master/services-custom/dynamodb-enhanced/README.md
解决方案
如果我理解,您想将嵌套对象序列化为字符串,就像@DynamoDBTypeConvertedJson
注释DynamoDBMapper
在 AWS SDK for Java v1 中所做的那样。在适用于 Java 的 AWS 开发工具包 v2 中,没有开箱即用的功能来执行此操作。您必须手动编写自己的转换器,如下所示。
但是将其序列化为字符串确实没有任何好处,因此您可以考虑将其存储为嵌套文档。它不需要对您发布的代码进行任何更改。将其存储为文档确实有一些好处,例如能够更新单个嵌套字段。你永远不知道什么时候会出现需要这个的需求,而且我不知道将它存储为文档有什么缺点。
注意:我认为不适@DynamoDbFlatten
用于您的情况,因为展平列表没有意义。
class GenericRecordListConverter implements AttributeConverter<List<GenericRecord>> {
private static final ObjectMapper MAPPER = new ObjectMapper();
public static GenericRecordListConverter create() {
return new GenericRecordListConverter();
}
@Override
public AttributeValue transformFrom(List<GenericRecord> input) {
try {
return AttributeValue.builder().s(MAPPER.writeValueAsString(input)).build();
}
catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
@Override
public List<GenericRecord> transformTo(AttributeValue input) {
try {
return MAPPER.readValue(input.s(), new TypeReference<List<GenericRecord>>() {});
}
catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
@Override
public EnhancedType<List<GenericRecord>> type() {
return EnhancedType.listOf(GenericRecord.class);
}
@Override
public AttributeValueType attributeValueType() {
return AttributeValueType.S;
}
}
推荐阅读
- npm - 实时服务器包
- powershell - 如何在 PowerShell 脚本中跳过空值
- flutter - api调用后如何更新initState()中的列表?
- css - CSS - 咆哮时网格失去结构
- sql-server - 如何从我的结果中删除 CASE 语句?
- javascript - 如何通过“@solana/web3.js”和“@solana/spl-token”调用 nft 程序?
- javascript - 如何在 Javascript 中访问以下对象参数
- symfony - 更改来自供应商捆绑包的订阅者的优先级
- swift - 如何在 Swift 中将纹理应用于 3d obj 模型上的特定通道?
- vue.js - VueJS 3 - 如何使用可拖动的嵌套元素但防止重复项