我有一个包含从DynamoDB导出的数据的文件,它具有DynamoDB的“特殊JSON”格式:
{"key1": {"m":{"key2":{"s":"val2"},"key3":{"s":"val3"}}}}
我需要解析这个文件,并将数据转换为(com.amazonaws.services.dynamodbv2.document.Item)项DynamoDB或普通JSON (我知道如何将普通JSON转换为条目)
我发现有一些方法可以像下面的文章一样将Map转换为项目: 1. 用Java将DynamoDB JSON转换为标准JSON 2. 如何从DynamoDB流新映像中获取纯Json字符串?
要使用这些文章中提到的解决方案,我需要编写代码将特殊的JSON转换为Map。
是否存在将DynamoDB“特殊JSON”文本转换为普通JSON或直接转换为DynamoDB项的本机方式?
发布于 2018-08-24 06:18:14
请使用此函数AWS.DynamoDB.Converter.unmarshall
相关文档:财产
发布于 2018-05-12 23:26:05
我也没有找到,所以我写了一些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]
}
上面应该和AWS.DynamoDB.Converter.unmarshall在Javascript中做同样的处理。
然后使用Item.fromMap(newImage.toSimpleMapValue())
将DynamoDB映射/Json转换为Item。
我没有测试所有的情况,特别是不确定二进制类型。
https://stackoverflow.com/questions/49163647
复制相似问题