首页 文章

Amazon Web Services,在Android程序中读取存储DynamoDB Json数据

提问于
浏览
0

我将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 回答

  • 0

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

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

相关问题