我了解DynamoDBMapper但在我的情况下我无法使用它,因为我事先并不了解所有属性。
我有一个JSON,并使用Jackson
解析器将其解析为对象地图:
Map<String, Object> userData = mapper.readValue(new File("user.json"), Map.class);
循环遍历每个属性,如果DynamoDB AttributeValue
支持布尔值,字符串,数字,字节,列表等,如何将值转换为AttributeValue
有一种有效的方法吗?这个库已经有了吗?我天真的方法是检查每个值是否为Boolean / String / Number / etc类型。然后调用相应的AttributeValue
方法,例如:new AttributeValue().withN(value.toString())
- 这给了我很长的if, else if
答案 0 :(得分:26)
最后通过查看AWS parses the JSON
的方式得出结论基本上,这是代码:
Item item = new Item().withJSON("document", jsonStr);
Map<String,AttributeValue> attributes = InternalUtils.toAttributeValues(item);
return attributes.get("document").getM();
非常整洁。
答案 1 :(得分:3)
以下是一个简单的解决方案,可用于将任何DynamoDB Json转换为Simple JSON。
//passing the reponse.getItems()
public static Object getJson(List<Map<String,AttributeValue>> mapList) {
List<Object> finalJson= new ArrayList();
for(Map<String,AttributeValue> eachEntry : mapList) {
finalJson.add(mapToJson(eachEntry));
}
return finalJson;
}
//if the map is null then it add the key and value(string) in the finalKeyValueMap
public static Map<String,Object> mapToJson(Map<String,AttributeValue> keyValueMap){
Map<String,Object> finalKeyValueMap = new HashMap();
for(Map.Entry<String, AttributeValue> entry : keyValueMap.entrySet())
{
if(entry.getValue().getM() == null) {
finalKeyValueMap.put(entry.getKey(),entry.getValue().getS());
}
else {
finalKeyValueMap.put(entry.getKey(),mapToJson(entry.getValue().getM()));
}
}
return finalKeyValueMap;
}
这将以List<Map<String,Object>>
的形式产生您想要的Json,它是object
的子集。
答案 2 :(得分:3)
我使用JacksonConverterImpl将JsonNode
转换为Map<String, AttributeValue>
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readValue(jsonString, JsonNode.class);
final JacksonConverter converter = new JacksonConverterImpl();
Map<String, AttributeValue> map = converter.jsonObjectToMap(jsonNode);
希望这会有所帮助!
谢谢, 杰伊