我有一个包含从DynamoDB导出的数据的文件,它有DynamoDB"特殊的JSON"格式:
{"key1": {"m":{"key2":{"s":"val2"},"key3":{"s":"val3"}}}}
我需要解析这个文件并将数据转换为DynamoDB项(com.amazonaws.services.dynamodbv2.document.Item)或普通JSON(我知道如何将普通JSON转换为Item)
我发现有一些方法可以将Map转换为Item,如下面的帖子: 1. Converting DynamoDB JSON to Standard JSON with Java 2. How to get the pure Json string from DynamoDB stream new image?
要使用这些帖子中提到的解决方案,我需要编写代码将特殊的JSON转换为Map。
是否有本地方式转换DynamoDB"特殊JSON" 文本到普通JSON还是直接到DynamoDB项?
答案 0 :(得分:1)
请使用此功能AWS.DynamoDB.Converter.unmarshall
相关文档:unmarshall-property
答案 1 :(得分:0)
我没有找到任何一个,所以我写了一些kotlin代码来做到这一点
// convert dynamodb json map to normal json map
@Suppress("unchecked_cast")
internal fun Map<String, Any>.toSimpleMapValue(): Map<String, Any> {
return this.mapValues { (_, v) ->
(v as Map<String, Any>).toSimpleValue()
}
}
@Suppress("unchecked_cast", "implicit_cast_to_any")
private fun Map<String, Any>.toSimpleValue() : Any {
require(this.size == 1)
val list = this.map { (k, v) ->
when (k) {
"BOOL" -> when (v) {
0 -> false
1 -> true
else -> throw IllegalArgumentException("Unknown value $v for boolean")
}
"S" -> v as String
"N" -> BigDecimal(v as String)
"B" -> copyAllBytesFrom(v as ByteBuffer)
"SS" -> LinkedHashSet(v as List<String>)
"NS" -> LinkedHashSet((v as List<String>).map { BigDecimal(it) })
"BS" -> LinkedHashSet((v as List<ByteBuffer>).map { copyAllBytesFrom(it) })
"L" -> ArrayList((v as List<Any>).map { (it as Map<String, Any>).toSimpleValue() })
"M" -> (v as Map<String, Any>).toSimpleMapValue()
else -> throw IllegalArgumentException("Invalid key $k")
}
}
return list[0]
}
上面应该与Javascript SDK中的AWS.DynamoDB.Converter.unmarshall相同。
然后使用Item.fromMap(newImage.toSimpleMapValue())
将DynamoDB Map / Json转换为Item。
我没有测试所有情况,特别是不确定二进制类型。