Amazon Web Services, Read store DynamoDB Json data in Androi



我将 Json 数据存储到 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

是 Amazon 为 DynamoDB 表提供的具有 accesors 方法的类,简单地说,表中的所有字段都是字符串。 我在扫描命令中收到此错误:

com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMappingException: Expected S in value {M:......

并提到了自定义封送拆收器的使用,问题是检索 DynamoDB Json 格式的字段"有效负载"的数据。有关 read Json 和封送处理器使用的文档含糊不清,无法满足所有需求。 在论坛中调查并获取示例代码后,我使用多种类型的封送处理器进行了测试,为有效负载创建了一个类,并更改了表访问器的类型,但问题仍然存在,无法检索有效负载字段的数据。

I 包括有效负载类、自定义编组器和在表访问器中所做的更改,这些更改被注释。抱歉,我是安卓和 AWS 的新手,我了解编组拆收器的概念和系列化数据,但我真的不知道如何做到这一点或是否可能。

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;}
}

有效载荷马歇尔.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;
}
}
}

看起来你有一个布尔值而不是一个字符串

"alive": {
"BOOL": true
},

最新更新