Я читаю резервную копию DynamoDB S3 bucket, которая имеет формат для DynamoDB Json.
Я пытаюсь преобразовать его в обычный Json без AttributeValue.
Исходная строка
{
"id": {
"s": "someString"
},
"name": {
"b": "someByteBuffer"
},
"anotherId": {
"s": "someAnotherString"
},
"version": {
"n": "1"
}
}
Пытаюсь преобразовать в
{
"id": "someString",
"name": "someByteBuffer",
"anotherId": "someAnotherString",
"version": "1"
}
Есть много ответов, на которые я ссылался, но он не преобразуется в обычный Json, он возвращает мне тот же Json.
Вот что я пробовал:
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(inputJsonString);
final JacksonConverter converter = new JacksonConverterImpl();
Map<String, AttributeValue> map = converter.jsonObjectToMap(jsonNode);
Item item = ItemUtils.toItem(map);
Gson gson = new Gson();
System.out.println(gson.toJson(item.asMap()));
Кроме того, во время отладки я не смог правильно создать карту. Карта будет содержать ключ как «id», значение как AttributeValue. Но AttributeValue будет содержать строку внутри своего собственного Map<String, AttributeValue>, а не внутри String s.
Я чувствую, что что-то упускаю при создании карты. Есть указатели?
Ссылки на Stackoverflow: Ссылка 1Ссылка 2
Спасибо,
Джей




То, что вы описываете как результат, звучит правильно. Если вы посмотрите на исходную строку JSON, у вас есть список пар ключ: значение, где каждое значение является другим списком пар ключ: значение (длина 1, но все же список).
Чтобы преобразовать это в единый список пар ключ: значение, вам нужно написать цикл типа map-reduce. В основном выполните итерацию первой карты, возьмите ключ, затем из второй карты (которая является значением для ключа, который вы только что записали), просто возьмите значение первой записи (AttributeValue) и добавьте эту пару ключ: значение в новую карту ( Map<String, AttributeValue>, который вы определяете перед циклом). Затем эту карту вы можете преобразовать в JSON, и в результате получится строка JSON, которую вы ожидали.
Надеюсь, это поможет!
После прочтения документации docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/… кажется, что вы можете захотеть взять значение AttributeValue, преобразовать его в String, а затем добавить его в
Map<String, String>вместоMap<String, AttributeValue>. Попробуйте оба варианта и посмотрите, каков ваш результат.