我正在尝试使用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解组为字符串,尽管我认为我已经正确设置了它。谁能帮助我了解我所缺少的内容以及如何解决此问题?我将衷心感谢您的帮助!
最佳答案
不推荐使用DynamoDBMarshalling,因此建议使用更新的DynamoDBTypeConverted批注。
Mapping Arbitrary Data上有一些有用的注释。
您还可以在this answer中查看我的示例
总之,您将创建一个AllCities
纯Java对象。然后,您编写一个简单的转换器类,该类告诉DynamoDB如何将AllCities
对象转换为字符串以进入DynamoDB。同样,转换器类告诉您的应用程序如何将字符串转换回Java对象。