Десериализация значения первичного ключа с подчеркиванием: неожиданный символ Ожидаемый пробел, разделяющий значения корневого уровня

В Java, используя Jackson ObjectMapper, я пытаюсь десериализовать объект Dynamo DB, считываемый из потока Dynamo DB.

Сначала я вызываю: record.getDynamodb().getNewImage().get("primaryKey").getS().toString(), чтобы получить значение primaryKey "1_12345" обратно из потока.

Затем я использую его в сопоставителе объектов, чтобы создать новый экземпляр объекта Metrics с набором членов primaryKey:objectMapper.readValue("1_12345", Metrics.class);

Проблема в том, что я получаю исключение для этого вызова: Unexpected character ('_' (code 95)): Expected space separating root-level values

Metrics.class — это простой POJO без конструктора. Мне интересно, нужны ли мне какие-либо специальные аннотации или escape-символы в моем вызове readValue. Кажется, я не могу найти каких-либо четких указаний на то, что решение в случае этой ошибки.

(Примечание: причина, по которой я не могу проанализировать его прямо из json, заключается в том, что структура json при анализе из потока не является простой, значение выглядит так: S указывает строку, N для числа и т. д.: {primaryKey={S: 1_12345,}, rangeKey={N: xxx}... etc. })


person Tibberzz    schedule 26.09.2017    source источник
comment
1_12345 недействителен json. Как выглядит ваш объект Metrics? JSON должен соответствовать ему структурно.   -  person teppic    schedule 27.09.2017


Ответы (1)


Спасибо, это была проблема, вызов readValue() принимает строку в формате JSON. Решение состояло в том, чтобы преобразовать потоковое изображение динамо в списки и карты (с использованием dynamodbv2 libs), пока оно не будет в правильном формате, как показано ниже:

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); 
}
person Tibberzz    schedule 29.09.2017