我将Json Data存储到DynamoDB表中,数据如下所示:
"payload": {
"M": {
"state": {
"M": {
"reported": {
"M": {
"alive": {
"BOOL": true
},
"reg": {
"N": "0"
},
"timestamp": {
"N": "1520357203.4857106"
}
}
}
}
}
}
我需要将这些数据检索到android程序,使用scan命令读取表中的所有数据:
DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();
List<PcObject2DO> result = dynamoDBMapper.scan(PcObject2DO.class, scanExpression);
哪里
PcObject2DO
是具有亚马逊为DynamoDB表提供的加速器方法的类,表中的所有字段都是字符串 . 我在scan命令中收到此错误:
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMappingException: Expected S in value {M:......
并提到使用自定义封送程序,问题是检索DynamoDB Json格式的字段“payload”的数据 . 关于阅读Json和使用编组的文档含糊不清,并未涵盖所有需求 . 在论坛中调查并获取示例代码后,我使用多种类型的封送程序进行了测试,为有效负载创建了一个类,并且还更改了表加法器的类型,但问题仍然存在,无法检索有效负载字段的数据 .
我包括有效负载类,自定义编组器以及表增强器中所做的更改,这些更改已被注释 . 对不起,我是android和AWS的新手,我理解封送器和seriealized数据的概念,但我真的不知道这是怎么做的或者是否可能 .
PcObject2DO.java
@DynamoDBTable(tableName = "xxxxxxxxxxxx-thing")
public class PcObject2DO {
private String _reg;
private String _timestamp;
private String _payload;
//private Map<String, Payload> _payload;
//private static final JsonMarshaller<Payload>PAYLOAD_JSON_MARSHALLER = new JsonMarshaller<Payload>();
@DynamoDBHashKey(attributeName = "reg")
@DynamoDBAttribute(attributeName = "reg")
public String getReg() {
return _reg;
}
public void setReg(final String _reg) {
this._reg = _reg;
}
@DynamoDBRangeKey(attributeName = "timestamp")
@DynamoDBAttribute(attributeName = "timestamp")
public String getTimestamp() {
return _timestamp;
}
public void setTimestamp(final String _timestamp) {
this._timestamp = _timestamp;
}
@DynamoDBAttribute(attributeName = "payload")
public String getPayload() {
return _payload;
}
public void setPayload(final String _payload) {
this._payload = _payload;
}
/*public Set<String> getPayload() {
if(_payload !=null){
Set<String> jsonSet = new HashSet<String>(_payload.size());
for(Payload data : _payload){
String json = PAYLOAD_JSON_MARSHALLER.marshall(data);
jsonSet.add(json);
}
return jsonSet;
}else {
return null;
}
}
public void setPayload(Set<String> jsonSet) {
if(jsonSet != null){
_payload = new HashSet<Payload>(jsonSet.size());
for(String json : jsonSet){
Payload data = PAYLOAD_JSON_MARSHALLER.unmarshall(Payload.class, json);
_payload.add(data);
}
}
}*/
//-----
}
Payload.Java
public class Payload {
private Boolean alive;
private int reg;
private String timestamp;
public Boolean getAlive() {return alive;}
public void setAlive(Boolean alive) {this.alive = alive;}
public int getReg() {return reg;}
public void setReg(int reg){this.reg = reg;}
public String getTimestamp() {return timestamp;}
public void setTimestamp(String timestamp) {this.timestamp = timestamp;}
}
PayloadMarshaller.java
public class PayloadMarshaller implements DynamoDBMarshaller<List<Payload>> {
private static final ObjectMapper mapper = new ObjectMapper();
private static final ObjectWriter writer = mapper.writer();
@Override
public String marshall(List<Payload> obj ) {
try {
return writer.writeValueAsString(obj);
}catch (JsonProcessingException e){
e.printStackTrace();
return "";
}
}
@Override
public List<Payload> unmarshall (Class<List<Payload>> clazz, String json){
final CollectionType type = mapper.getTypeFactory().constructCollectionType(List.class, Payload.class);
try{
return mapper.readValue(json, type);
}catch (Exception e){
e.printStackTrace();
return null;
}
}
}
1 回答
看起来你有一个布尔值而不是一个字符串