dynamodb嵌套Map到java对象

ljsrvy3e  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(399)

我使用的是一个dynamodb表,其中dynamodbattributetype.mMap相互嵌套。我遇到问题的表字段如下所示:

"Data": {

"EnglishName": "Balcony",
"High": {
  "Status": true,
  "Triggered": true,
  "Value": 5
},
"Low": {
  "Status": true,
  "Triggered": false,
  "Value": 1
},
"TagName": "tag1"
}

Map的所有键都是字符串,有些值是字符串,有些是Map。在我的java代码中,数据由一个类表示,这个类是另一个类的属性,它表示整个表。属性“low”和“high”也由java类和data类的属性表示。
我尝试过用很多方法将它Map到java对象,主要是通过dynamodbtypeconverter。最困难的是,我找不到任何有关谷歌的信息。我只找到了一个属性类型为s而不是m的converter类示例。
我不断出错:
无法取消插入属性
如何做到这一点?

o75abkj4

o75abkj41#

最后我有了一个有效的解决方案。基本上,答案是在dynamodbtypeconverter中使用map<string,attributevalue>和所需的对象类型,如下所示:

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,它接受<string,alert>。

mnemlml8

mnemlml82#

你试过用gson这样的工具吗?如果要将dynamodb响应作为json字符串返回,请尝试以下操作:

Gson gson = new Gson();
Data data = gson.fromJson(jsonString, Data.class);

相关问题