【问题标题】:Convert DynamoDB special JSON text to normal JSON将 DynamoDB 特殊 JSON 文本转换为普通 JSON
【发布时间】:2022-02-21 19:23:35
【问题描述】:

我有一个包含从 DynamoDB 导出的数据的文件,它具有 DynamoDB 的“特殊 JSON”格式:

{"key1": {"m":{"key2":{"s":"val2"},"key3":{"s":"val3"}}}}

我需要解析这个文件并将数据转换为 DynamoDB 项目(com.amazonaws.services.dynamodbv2.document.Item)或普通 JSON(我知道如何将普通 JSON 转换为项目)

我发现有一些方法可以将 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 项目的本地方法?

【问题讨论】:

  • Map 指的是 Map。 AttributeValue 是 com.amazonaws.services.dynamodbv2.model.AttributeValue;

标签: java json amazon-dynamodb


【解决方案1】:

请使用此功能AWS.DynamoDB.Converter.unmarshall

相关文档:unmarshall-property

【讨论】:

    【解决方案2】:

    我也没有找到,所以我写了一些 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。

    我没有测试所有的情况,尤其是不确定二进制类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      相关资源
      最近更新 更多