我使用的是 DynamoDB 表,其中 DynamoDBAttributeType.M 映射相互嵌套。我遇到问题的表字段如下所示:
"Data": {
"EnglishName": "Balcony",
"High": {
"Status": true,
"Triggered": true,
"Value": 5
},
"Low": {
"Status": true,
"Triggered": false,
"Value": 1
},
"TagName": "tag1"
}
映射的所有键都是字符串,一些值是字符串,一些是映射。在我的Java代码中,数据由一个类表示,它是另一个类的属性,代表整个表。属性“低”和“高”也由 Java 类和数据类的属性表示。
我尝试使用多种方法将其映射到 Java 对象,主要是通过 DynamoDBTypeConverter。最困难的部分是我无法通过谷歌找到任何关于此的信息。我只找到了一个转换器类的示例,其中属性类型是 S 而不是 M。
我不断收到错误:
无法取消转换属性
如何做到这一点?
我终于有了一个有效的解决方案。基本上答案是在 DynamoDBTypeConverter 中使用 Map
public class DataConverter implements DynamoDBTypeConverter<Map<String, AttributeValue>, Data> {
@Override
public Map<String, AttributeValue> convert(Data data) {
ObjectMapper mapper = new ObjectMapper();
Item item = new Item()
.withString("englishName", data.getEnglishName())
.withMap("high", mapper.convertValue(data.getHigh(), Map.class))
.withMap("low", mapper.convertValue(data.getLow(), Map.class))
.withString("tagName", data.getTagName());
return ItemUtils.toAttributeValues(item);
}
@Override
public Data unconvert(Map<String, AttributeValue> data) {
Data tagData = new Data();
try {
ObjectMapper mapper = new ObjectMapper();
String item = ItemUtils.toItem(data).toJSON();
JsonNode json = mapper.readTree(item);
tagData = mapper.convertValue(json, Data.class);
} catch (JsonProcessingException ex) {
Logger.getLogger(TagDataConverter.class.getName()).log(Level.SEVERE, null, ex);
}
return tagData;
}
我还需要将类型转换器写入对象属性并在类中对其进行注释:
public class Data {
private String tagName;
private String englishName;
@DynamoDBTypeConverted(converter = AlertConverter.class)
private Alert low;
@DynamoDBTypeConverted(converter = AlertConverter.class)
private Alert high;
AlertConverter.class 是一个普通的 DynamoDBTypeConverter,它接受
您尝试过使用Gson之类的工具吗?如果您要以 JSON 字符串形式返回 DynamoDB 响应,请尝试以下操作:
Gson gson = new Gson();
Data data = gson.fromJson(jsonString, Data.class);