将DynamoDB特殊JSON文本转换为普通JSON

时间:2018-03-08 00:47:05

标签: json amazon-dynamodb

我有一个包含从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项?

2 个答案:

答案 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。

我没有测试所有情况,特别是不确定二进制类型。