Я новичок в AppSync (и GraphQL) в целом, но я сталкиваюсь со странной проблемой при подключении преобразователей к нашим таблицам DynamoDB. В частности, у нас есть вложенная структура карты для одного из атрибутов нашего элемента, которая создается произвольно (ее сложность и форма зависят от типа родительского элемента) - что-то вроде этого:
"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! поможет. Я начинаю беспокоиться, что нет никакого способа восстановить нашу базовую схему. Любые предложения об обратном были бы полезны!
P.S. Я заметил в журналах 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": ...
Извиняюсь за длинный вопрос, но я в тупике.
Я столкнулся с этой проблемой, вы что-нибудь поняли?
Не ожидайте увидеть объект JSON в ответе GraphQL для типа AWSJSON. GraphQL вернет объект JSON только для типов, которые вы объявили в схеме. Для типа AWSJSON он вернет строку, которая будет содержать экранированный JSON.

Вы можете попытаться создать тип для поля данных, который содержит все возможные поля, а затем разрешить поля в соответствии с родительским типом, или, в качестве альтернативы, вы можете попытаться реализовать Графические интерфейсы
AWSJSON - это строковый тип JSON, поэтому вы всегда получите строковое значение (это то, чего должно придерживаться определение вашего типа).
Вы изначально создавали Предмет, когда
Item.dataеще былString!?