使用下划线反序列化主键值:意外字符预期 space 分隔根级值
Deserializing Primary Key Value with Underscore: Unexpected character Expected space separating root-level values
在 Java 中,我尝试使用 Jackson ObjectMapper 反序列化从发电机数据库流中读取的发电机数据库对象。
我先打电话:
record.getDynamodb().getNewImage().get("primaryKey").getS().toString()
从流中获取“1_12345”的主键值。
然后我在对象映射器中使用它来创建具有 primaryKey 成员集的 Metrics 对象的新实例:objectMapper.readValue("1_12345", Metrics.class);
问题是我在该调用中遇到异常:
Unexpected character ('_' (code 95)): Expected space separating root-level values
Metrics.class 是一个没有构造函数的简单 POJO。我想知道我的 readValue 调用中是否需要任何特殊注释或转义字符。对于此错误,我似乎找不到任何明确的解决方案。
(旁注 - 我无法直接从 json 解析它的原因是因为 json 从流中解析时的结构并不简单,一个值看起来像这样,S 表示字符串,N 表示数字等:
{primaryKey={S: 1_12345,}, rangeKey={N: xxx}... etc. }
)
谢谢,这就是问题所在,readValue() 调用采用 JSON 格式的字符串。解决方案是将 dynamo 流图像转换为列表和地图(使用 dynamodbv2 库),直到它的格式正确,如下所示:
Map<String, AttributeValue> newImage = record.getDynamodb().getNewImage();
List<Map<String, AttributeValue>> listOfMaps = new ArrayList<Map<String, AttributeValue>>();
listOfMaps.add(newImage);
List<Item> itemList = InternalUtils.toItemList(listOfMaps);
for (Item item : itemList) {
String json = item.toJSON();
Metrics metric = objectMapper.readValue(json, Metrics.class);
}
在 Java 中,我尝试使用 Jackson ObjectMapper 反序列化从发电机数据库流中读取的发电机数据库对象。
我先打电话:
record.getDynamodb().getNewImage().get("primaryKey").getS().toString()
从流中获取“1_12345”的主键值。
然后我在对象映射器中使用它来创建具有 primaryKey 成员集的 Metrics 对象的新实例:objectMapper.readValue("1_12345", Metrics.class);
问题是我在该调用中遇到异常:
Unexpected character ('_' (code 95)): Expected space separating root-level values
Metrics.class 是一个没有构造函数的简单 POJO。我想知道我的 readValue 调用中是否需要任何特殊注释或转义字符。对于此错误,我似乎找不到任何明确的解决方案。
(旁注 - 我无法直接从 json 解析它的原因是因为 json 从流中解析时的结构并不简单,一个值看起来像这样,S 表示字符串,N 表示数字等:
{primaryKey={S: 1_12345,}, rangeKey={N: xxx}... etc. }
)
谢谢,这就是问题所在,readValue() 调用采用 JSON 格式的字符串。解决方案是将 dynamo 流图像转换为列表和地图(使用 dynamodbv2 库),直到它的格式正确,如下所示:
Map<String, AttributeValue> newImage = record.getDynamodb().getNewImage();
List<Map<String, AttributeValue>> listOfMaps = new ArrayList<Map<String, AttributeValue>>();
listOfMaps.add(newImage);
List<Item> itemList = InternalUtils.toItemList(listOfMaps);
for (Item item : itemList) {
String json = item.toJSON();
Metrics metric = objectMapper.readValue(json, Metrics.class);
}