Android DynamoDBMappingException: ожидаемое значение S в значении - PullRequest
1 голос
/ 22 мая 2019

Я пытаюсь отобразить объект json из моей таблицы DynamodB, используя DynamoDbMapper и с последним aws android sdk: com.amazonaws: aws-android-sdk-ddb-mapper: 2.13.0, я вижу это исключение: "DynamoDBMappingException: ожидаемое S в значении ...

Объект json в моей таблице имеет 3 атрибута, 2 из которых являются строковыми, а третий - список сложных объектов. Я создал объект с использованием@DynamoDbDocument аннотация для сложного объекта и используется правильная аннотация маршалинга, но, похоже, она не демаршалирует объект json в объект java. Сложный объект - это объект json в этом формате:

{
  "allCitiesList": [
    {
      "city": "Auckland, New Zealand",
      "times": {
        "recTimes": [
          "Jan1",
          "Jan2"
        ]
      }
    }
}
public class CitiesDO {
    private String city;
    private String country;
    private List<AllCitiesObject> allCitiesList;
...get/setters for other fields...

    @DynamoDBMarshalling(marshallerClass = 
    AllCitiesJSONMarshaller.class)
    public List<AllCitiesObject> getAllCitiesList() {
        return allCitiesList;
    }

    public void setAllCitiesList(List<AllCitiesObject> allCitiesList) {
        this.allCitiesList = allCitiesList;
    }
}
@DynamoDBDocument
public class AllCitiesObject {
    @DynamoDBAttribute(attributeName = "allCitiesList")
    private String data;

    public AllCitiesObject(){}

    public String getData() {
        return data.toString();
    }

    public void setData(String data) {
        this.data = data;
    }
}

class AllCitiesJSONMarshaller extends JsonMarshaller<AllCitiesObject> {}

Также пробовал этот подход с пользовательским маршаллером, но безуспешно:

public class MyCustomMarshaller implements DynamoDBMarshaller<List<AllCitiesObject>> {

    private static final ObjectMapper mapper = new ObjectMapper();
    private static final ObjectWriter writer = mapper.writer();

    @Override
    public String marshall(List<AllCitiesObject> obj) {

        try {
            return writer.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(
                    "Unable to marshall the instance of " + obj.getClass()
                            + "into a string", e);
        }
    }

    @Override
    public List<AllCitiesObject> unmarshall(Class<List<AllCitiesObject>> clazz, String json) {
        final CollectionType
                type =
                mapper.getTypeFactory().constructCollectionType(List.class, AllCitiesObject.class);
        try {
            return mapper.readValue(json, type);
        } catch (Exception e) {
            throw new RuntimeException("Unable to unmarshall the string " + json
                    + "into " + clazz, e);
        }
    }

}

Исключение составляет: DynamoDBMappingException: ожидаемое S в значении {L: [{M: {times = {M: {recTimes = {L: [{S: Jan1,}, {S: Jan2,}

Мне трудно разобрать JSON в строку, хотя ядумаю, я настроил этоправильно.Может кто-нибудь помочь мне понять, что мне не хватает и как подойти к этому вопросу?Буду очень признателен за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Если кто-то еще полностью застрял в этой проблеме с ddbMapper, рассмотрите возможность использования ddbClient для явного преобразования и сопоставления вашего объекта DO с данными таблицы ddb.Из-за нехватки времени я вернусь к этому позже, выясню проблему с отображением и опубликую ответ здесь на случай, если он кому-нибудь поможет.

0 голосов
/ 22 мая 2019

DynamoDBMarshalling устарела, поэтому я предлагаю использовать более новую аннотацию DynamoDBTypeConverted .

Есть несколько полезных замечаний по Отображение произвольных данных .

Вы также можете увидеть мой пример в этот ответ

В итоге вы создаете AllCities обычный Java-объект. Затем вы пишете простой класс конвертера, который сообщает DynamoDB, как превратить ваш объект AllCities в строку, чтобы попасть в DynamoDB. Аналогично, класс преобразователя сообщает вашему приложению, как превратить строку обратно в объект Java.

...