在AWS AppSync查询中返回嵌套的JSON

时间:2018-08-11 19:37:04

标签: json graphql aws-appsync vtl

通常来说,我对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 !,响应将用:替换数据中的所有=。我们已经使用响应解析器尝试了所有方法,包括诸如How return JSON object from DynamoDB with 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日志中注意到,context.result.data响应字段下存在适当的JSON响应,但是不知何故,下面的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 个答案:

答案 0 :(得分:0)

您可以尝试为包含所有可能字段的数据字段创建类型,然后将字段解析为与父类型对应的字段,或者尝试实现graphQL interfaces

答案 1 :(得分:0)

AWSJSON是JSON字符串类型,因此您将始终获取一个字符串值(这是您的类型定义必须遵守的内容)。