/
JsonToAttributeValueConverter.java
65 lines (56 loc) · 2.61 KB
/
JsonToAttributeValueConverter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package com.exasol.dynamodb.attributevalue;
import java.io.StringReader;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import com.exasol.errorreporting.ExaError;
import jakarta.json.*;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
public class JsonToAttributeValueConverter {
private static final JsonToAttributeValueConverter INSTANCE = new JsonToAttributeValueConverter();
/**
* Private constructor to hide the public default.
*/
private JsonToAttributeValueConverter() {
/* empty on purpose */
}
public static JsonToAttributeValueConverter getInstance() {
return INSTANCE;
}
public Map<String, AttributeValue> convert(final String json) {
final JsonObject jsonObject = Json.createReader(new StringReader(json)).readObject();
return convertJsonObject(jsonObject);
}
private AttributeValue convertJsonValue(final JsonValue value) {
switch (value.getValueType()) {
case NUMBER:
final JsonNumber jsonNumber = (JsonNumber) value;
return AttributeValue.builder().n(jsonNumber.toString()).build();
case STRING:
final JsonString jsonString = (JsonString) value;
return AttributeValue.builder().s(jsonString.getString()).build();
case TRUE:
return AttributeValue.builder().bool(true).build();
case FALSE:
return AttributeValue.builder().bool(false).build();
case NULL:
return AttributeValue.builder().nul(true).build();
case ARRAY:
final JsonArray jsonArray = (JsonArray) value;
final List<AttributeValue> convertedListItems = jsonArray.stream().map(this::convertJsonValue)
.collect(Collectors.toList());
return AttributeValue.builder().l(convertedListItems).build();
case OBJECT:
final JsonObject jsonObject = (JsonObject) value;
return AttributeValue.builder().m(convertJsonObject(jsonObject)).build();
default:
throw new UnsupportedOperationException(ExaError.messageBuilder("F-VSDY-18").message(
"Failed to convert JSON value of type {{type}} to DynamoDB attribute value. This conversion is not yet implemented.",
value.getValueType().toString()).ticketMitigation().toString());
}
}
private Map<String, AttributeValue> convertJsonObject(final JsonObject jsonObject) {
return jsonObject.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, each -> convertJsonValue(each.getValue())));
}
}