java - Android DynamoDBMappingException:值中的预期 S
问题描述
我正在尝试使用 DynamoDbMapper 和最新的 aws android sdk:com.amazonaws:aws-android-sdk-ddb-mapper:2.13.0 从我的 dynamodb 表中映射一个 json 对象,我看到了这个异常:“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: Expected S in value {L: [{M: {times={M: {recTimes={L: [{S: Jan1,}, {S: Jan2,}
尽管我认为我已正确设置它,但我很难将 json 解组为字符串。谁能帮我理解我所缺少的以及如何解决这个问题?我将衷心感谢您的帮助!
解决方案
DynamoDBMarshalling已弃用,因此我建议使用较新的DynamoDBTypeConverted注释。
映射任意数据有一些有用的注释。
你也可以在这个答案中看到我的一个例子
总之,您创建了一个AllCities
普通的 java 对象。然后,您编写一个简单的转换器类,它告诉 DynamoDB 如何将您的AllCities
对象转换为字符串以进入 DynamoDB。同样,转换器类告诉您的应用程序如何将字符串转回 Java 对象。
推荐阅读
- python - 为什么我的 joblib 文件没有保存在与我的 Jupyter 文件相同的目录中?
- html - 有没有办法获取脚本标签被调用的位置?
- ajax - 自动加载 TabularForm Yii2 中的行
- python - 为什么Python中类继承中的一些__init__方法没有被调用?
- reactjs - React:获取数据,但无法访问对象属性
- angular - 使用 Stackblitz 安装依赖项的问题
- java - android中的Firebase多个查询
- python - 运行烧瓶 Web 应用程序时出现内部服务器错误 500
- python - 拟合非线性回归 pandas
- pandas - 为什么熊猫中的文件csv存储不正确?