Android DynamoDBMappingException:预期的S值

时间:2019-05-22 03:24:42

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

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

我表中的json对象具有3个属性,其中2个是字符串,第三个是复杂对象的列表。我已经使用@DynamoDbDocument注释为复杂对象创建了一个对象,并使用了正确的封送处理注释,但它似乎并未将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);
        }
    }

}

例外是: DynamoDBMappingException:期望的S值{L:[{M:{times = {M:{recTimes = {L:[{S:Jan1,},{S:Jan2,}

我很难将json解组为字符串,尽管我认为我已经正确设置了它。谁能帮助我了解我所缺少的内容以及如何解决此问题?非常感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

DynamoDBMarshalling已过时,因此我建议使用较新的DynamoDBTypeConverted注释。

Mapping Arbitrary Data上有一些有用的注释。

您还可以在this answer

中查看我的示例

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

答案 1 :(得分:0)

如果其他人绝对无法解决ddbMapper的问题,请考虑使用ddbClient显式转换DO对象并将其与ddb表数据映射。由于时间限制,我将再次讨论该问题,并在稍后的时间解决映射问题,并在此处发布答案,以免对其他人有帮助。