Вернуть вложенный JSON в запрос AWS AppSync

Я довольно новичок в AppSync (и GraphQL) в целом, но у меня возникает странная проблема при подключении распознавателей к нашим таблицам DynamoDB. В частности, у нас есть вложенная структура Map для одного из атрибутов нашего элемента, который построен произвольно (его сложность и форма зависят от типа родительского элемента) - что-то вроде этого:

"item" : {
    "name": "something",
    "country": "somewhere",
    "data" : {
        "nest-level-1a": {
            "attr1a" : "foo",
            "attr1b" : "bar",
            "nest-level-2" : {
                "attr2a": "something else",
                "attr2b": [
                    "some list element",
                    "and another, for good measure"
                ]
            }
        }
    },
    "cardType": "someType"
}

Наш сопровождающий тип GraphQL следующий:

type Item {
    name: String!
    country: String!
    cardType: String!
    data: AWSJSON!  ## note: it was originally String!
}

Когда мы запрашиваем элемент, мы получаем следующий ответ:

{
    "data": {
        "genericItemQuery": {
            "name": "info/en/usa/bra/visa",
            "country": "USA:BRA",
            "cardType": "visa",
            "data": "{\"tourist\":{\"reqs\":{\"sourceURL\":\"https://travel.state.gov/content/passports/en/country/brazil.html\",\"visaFree\":false,\"type\":\"eVisa required\",\"stayLimit\":\"30 days from date of entry\"},\"pages\":\"One page per stamp required\"}}"
}}}

Проблема в том, что мы не можем получить Item.data распознаватель полей для возврата объекта JSON (даже когда мы прикрепляем к нему отдельный преобразователь уровня поля поверх обычного распознавателя запросов). Он всегда возвращает String и, как ни странно, если мы изменим ожидаемый тип поля на String!, ответ заменит все : в данных с =, Мы перепробовали все с нашими обработчиками ответов, включая предложения типа Как вернуть объект JSON из DynamoDB с appsync?, но мы полностью застряли на этом этапе.

Наш текущий обработчик ответов на наш запрос был возвращен к стандартному ответу после того, как ни одно из предложений в вышеупомянутом посте не сработало:

## 'Before' response mapping template on genericItemQuery query; same result as the 'After' listed below **
#set($result = $ctx.result)
#set($result.data = $util.parseJson($ctx.result.data))
$util.toJson($result)

## 'After' response mapping template **
$util.toJson($ctx.result)

Мы пытаемся избежать ситуации, когда нам нужно включать вспомогательные типы для каждого уровня гнезда в data (поскольку он изменяется в зависимости от типа родительского элемента и в тех случаях, как в приведенном мной примере, он может иметь три или четыре уровня), и мы подумали, что изменим тип схемы на AWSJSON! сделал бы трюк. Я начинаю беспокоиться, что нет способа обойти нашу базовую схему. Любые предложения об обратном будут полезны!

PS Я заметил в журналах CloudWatch, что соответствующий ответ JSON существует под context.result.data поле ответа, но почему-то есть следующее transformedTemplate (что, опять же, я нахожу очень необычным, учитывая, что мы не применяем какой-либо шаблон сопоставления, кроме как для преобразования результата в действительный JSON):

"arn": ...
"transformedTemplate": "{data={tourist={reqs={sourceURL=https://travel.state.gov/content/passports/en/country/brazil.html, visaFree=false, type=eVisa required, stayLimit=30 days from date of entry}, pages=One page per stamp required}}, resIds=USA:BRA, cardType=visa, id=info/en/usa/bra/visa}",
"context": ...

Извиняюсь за длинный вопрос, но я в тупике.

2 ответа

AWSJSON является строковым типом JSON, поэтому вы всегда будете возвращать строковое значение (это то, что должно соответствовать определению вашего типа).

Вы можете попытаться создать тип для поля данных, который содержит все возможные поля, а затем разрешить поля в соответствии с родительским типом или, альтернативно, вы можете попробовать реализовать интерфейсы graphQL.

Другие вопросы по тегам