java - Android DynamoDBMappingException : Expected S in value

标签 java android amazon-web-services amazon-dynamodb aws-sdk

我正在尝试使用 DynamoDbMapper 和最新的 aws android sdk: com.amazonaws:aws-android-sdk-ddb-mapper:2.13.0 从我的 dynamodb 表映射 json 对象,我看到此异常:“DynamoDBMappingException:值中预期为 S...

我的表中的json对象有3个属性,其中2个是字符串,第三个是复杂对象列表。我已经使用复杂对象的 @DynamoDbDocument 注释创建了一个对象,并使用了正确的编码(marshal)注释,但它似乎没有正确地将 json 对象解封为 java 对象。 复杂对象是一个以下格式的 json 对象:

{
  "allCitiesList": [
    {
      "city": "Auckland, New Zealand",
      "times": {
        "recTimes": [
          "Jan1",
          "Jan2"
        ]
      }
    }
}
public class CitiesDO {
    private String city;
    private String country;
    private List<AllCitiesObject> allCitiesList;
...get/setters for other fields...

    @DynamoDBMarshalling(marshallerClass = 
    AllCitiesJSONMarshaller.class)
    public List<AllCitiesObject> getAllCitiesList() {
        return allCitiesList;
    }

    public void setAllCitiesList(List<AllCitiesObject> allCitiesList) {
        this.allCitiesList = allCitiesList;
    }
}
@DynamoDBDocument
public class AllCitiesObject {
    @DynamoDBAttribute(attributeName = "allCitiesList")
    private String data;

    public AllCitiesObject(){}

    public String getData() {
        return data.toString();
    }

    public void setData(String data) {
        this.data = data;
    }
}

class AllCitiesJSONMarshaller extends JsonMarshaller<AllCitiesObject> {}

还使用自定义编码器尝试过这种方法,但没有成功:

public class MyCustomMarshaller implements DynamoDBMarshaller<List<AllCitiesObject>> {

    private static final ObjectMapper mapper = new ObjectMapper();
    private static final ObjectWriter writer = mapper.writer();

    @Override
    public String marshall(List<AllCitiesObject> obj) {

        try {
            return writer.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(
                    "Unable to marshall the instance of " + obj.getClass()
                            + "into a string", e);
        }
    }

    @Override
    public List<AllCitiesObject> unmarshall(Class<List<AllCitiesObject>> clazz, String json) {
        final CollectionType
                type =
                mapper.getTypeFactory().constructCollectionType(List.class, AllCitiesObject.class);
        try {
            return mapper.readValue(json, type);
        } catch (Exception e) {
            throw new RuntimeException("Unable to unmarshall the string " + json
                    + "into " + clazz, e);
        }
    }

}

异常(exception)情况是: DynamoDBMappingException:值 {L: [{M: {times={M: {recTimes={L: [{S: Jan1,}, {S: Jan2,}}

中的预期 S

尽管我认为我已经正确设置了它,但我在将 json 解码为字符串时遇到了困难。谁能帮助我了解我所缺少的内容以及如何解决这个问题?我非常感谢您的帮助!

最佳答案

DynamoDBMarshalling已弃用,因此我建议使用较新的 DynamoDBTypeConverted注解。

Mapping Arbitrary Data 有一些有用的注释.

您还可以在 this answer 中看到我的示例。

总之,您创建了一个 AllCities 纯 java 对象。然后,您编写一个简单的转换器类,告诉 DynamoDB 如何将您的 AllCities 对象转换为字符串以进入 DynamoDB。同样,转换器类告诉您的应用程序如何将字符串转换回 Java 对象。

关于java - Android DynamoDBMappingException : Expected S in value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56248883/

相关文章:

java - WildFly jdbc 与 Oracle 的连接

android - Navigator.push 在 ListView 中,ListTile 不起作用

amazon-web-services - 限制亚马逊 s3 下载

java - maven 程序集插件不包括我在构建的 jar 中的类

java - 无法接收嵌入的 ActiveMQ 统计消息

java - android studio 不再运行/调试(安装)RenderScript 应用到移动设备

java - 如何使用Java找到偏差

android - Twitch API,流 URL

java - 更改图像一秒钟

node.js - 仅没有范围的Nodejs DynamoDB CreateTable哈希返回ValidationException