您的问题的简单答案是:将返回的 JSON 字符串转换为 Dictionary 对象。
像这样:
let data = jsonDataItem.dataUsingEncoding(NSUTF8StringEncoding)
if data != nil {
var error : NSError?
let dict = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments, error: &error) as? NSDictionary
if let e = error {
...
} else {
...
}
但是,我强烈建议您查看更高级别的 DynamoDB 映射器类
使用 DynamoDB 映射器类时,您定义数据结构,然后将其提供给 DynamoDB Mapper。这是一个完整的示例,从表创建到表删除。该示例使用 DynamoDB Mapper 插入、删除、扫描和查询表。
首先需要初始化客户端SDK
let cp = AWSStaticCredentialsProvider(accessKey: "AK...", secretKey: "xxx")
let configuration = AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: cp)
AWSServiceManager.defaultServiceManager().setDefaultServiceConfiguration(configuration)
这只是一个示例。在代码中嵌入访问密钥和秘密密钥不是一个好习惯。最佳做法是改用AWSCognitoCredentialsProvider (read more about Cognito)。
定义一个类来映射表格中的项目
class Item : AWSDynamoDBModel, AWSDynamoDBModeling {
var email : String = ""
var date : String = ""
var note : String = ""
var number : Double = 0.0
override init!() { super.init() }
required init!(coder: NSCoder!) {
fatalError("init(coder:) has not been implemented")
}
class func dynamoDBTableName() -> String! {
return "Demo"
}
class func hashKeyAttribute() -> String! {
return "email"
}
class func rangeKeyAttribute() -> String! {
return "date"
}
//required to let DynamoDB Mapper create instances of this class
override init(dictionary dictionaryValue: [NSObject : AnyObject]!, error: NSErrorPointer) {
super.init(dictionary: dictionaryValue, error: error)
}
//workaround to possible XCode 6.1 Bug : "Type NotificationAck" does not conform to protocol "NSObjectProtocol"
override func isEqual(anObject: AnyObject?) -> Bool {
return super.isEqual(anObject)
} }
创建表格
self.createTable().continueWithSuccessBlock {(task: BFTask!) -> BFTask! in
NSLog("Create table - success")
return nil
}
func createTable() -> BFTask! {
let pt = AWSDynamoDBProvisionedThroughput()
pt.readCapacityUnits = 10
pt.writeCapacityUnits = 10
let emailAttr = AWSDynamoDBAttributeDefinition()
emailAttr.attributeName = "email"
emailAttr.attributeType = AWSDynamoDBScalarAttributeType.S
let dateAttr = AWSDynamoDBAttributeDefinition()
dateAttr.attributeName = "date"
dateAttr.attributeType = AWSDynamoDBScalarAttributeType.S
let emailKey = AWSDynamoDBKeySchemaElement()
emailKey.attributeName = "email"
emailKey.keyType = AWSDynamoDBKeyType.Hash
let dateKey = AWSDynamoDBKeySchemaElement()
dateKey.attributeName = "date"
dateKey.keyType = AWSDynamoDBKeyType.Range
let ct = AWSDynamoDBCreateTableInput()
ct.tableName = "Demo"
ct.provisionedThroughput = pt
ct.attributeDefinitions = [emailAttr, dateAttr]
ct.keySchema = [ emailKey, dateKey ]
NSLog("Creating table")
let client = AWSDynamoDB.defaultDynamoDB()
return client.createTable(ct)
}
删除表格
self.deleteTable().continueWithSuccessBlock({ (task: BFTask!) -> BFTask! in
NSLog("Delete table - success")
return nil
})
func deleteTable() -> BFTask! {
let dt = AWSDynamoDBDeleteTableInput()
dt.tableName = "Demo"
NSLog("Deleting table")
let client = AWSDynamoDB.defaultDynamoDB()
return client.deleteTable(dt)
}
插入项目
self.insertSomeItems().continueWithBlock({
(task: BFTask!) -> BFTask! in
if (task.error != nil) {
NSLog(task.error.description)
} else {
NSLog("DynamoDB save succeeded")
}
return nil;
})
func insertSomeItems() -> BFTask! {
let mapper = AWSDynamoDBObjectMapper.defaultDynamoDBObjectMapper()
var item = Item()
item.email = "stormacq@amazon.com"
item.date = "20141101"
item.note = "This is item #1"
item.number = 1.0
let task1 = mapper.save(item)
item = Item()
item.email = "stormacq@amazon.com"
item.date = "20141102"
item.note = "This is item #2"
item.number = 2.0
let task2 = mapper.save(item)
item = Item()
item.email = "stormacq@amazon.lu"
item.date = "20141103"
item.note = "This is item #3"
item.number = 3.0
let task3 = mapper.save(item)
return BFTask(forCompletionOfAllTasks: [task1, task2, task3])
}
加载单个项目
self.load("stormacq@amazon.com", range:"20141101").continueWithSuccessBlock({ (task: BFTask!) -> BFTask! in
NSLog("Load one value - success")
let item = task.result as Item
print(item)
return nil
})
func load(hash: String, range: String) -> BFTask! {
let mapper = AWSDynamoDBObjectMapper.defaultDynamoDBObjectMapper()
return mapper.load(Item.self, hashKey: hash, rangeKey: range)
}
查询哈希和范围键
/*
keyConditions
http://docs.aws.amazon.com/AWSiOSSDK/latest/Classes/AWSDynamoDBQueryInput.html#//api/name/keyConditions
*/
let cond = AWSDynamoDBCondition()
let v1 = AWSDynamoDBAttributeValue(); v1.S = "20141101"
cond.comparisonOperator = AWSDynamoDBComparisonOperator.EQ
cond.attributeValueList = [ v1 ]
let c = [ "date" : cond ]
self.query("stormacq@amazon.com", keyConditions:c).continueWithSuccessBlock({ (task: BFTask!) -> BFTask! in
NSLog("Query multiple values - success")
let results = task.result as AWSDynamoDBPaginatedOutput
for r in results.items {
print(r)
}
return nil
})
func query(hash: String, keyConditions:[NSObject:AnyObject]) -> BFTask! {
let mapper = AWSDynamoDBObjectMapper.defaultDynamoDBObjectMapper()
let exp = AWSDynamoDBQueryExpression()
exp.hashKeyValues = hash
exp.rangeKeyConditions = keyConditions
return mapper.query(Item.self, expression: exp)
}
扫描项目(全表扫描)
let cond = AWSDynamoDBCondition()
let v1 = AWSDynamoDBAttributeValue(); v1.S = "20141101"
cond.comparisonOperator = AWSDynamoDBComparisonOperator.GT
cond.attributeValueList = [ v1 ]
let exp = AWSDynamoDBScanExpression()
exp.scanFilter = [ "date" : cond ]
self.scan(exp).continueWithSuccessBlock({ (task: BFTask!) -> BFTask! in
NSLog("Scan multiple values - success")
let results = task.result as AWSDynamoDBPaginatedOutput
for r in results.items {
print(r)
}
return nil
})
func scan(expression : AWSDynamoDBScanExpression) -> BFTask! {
let mapper = AWSDynamoDBObjectMapper.defaultDynamoDBObjectMapper()
return mapper.scan(Item.self, expression: expression)
}
如果您在美国东部 1 地区没有其他 DynamoDB 用途,则运行此示例不会产生任何成本,因为它属于 DynamoDB's free tier。