簡體   English   中英

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

[英]Return nested JSON in AWS AppSync query

通常,我對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!,則響應將用=替換data中的所有: 我們已嘗試使用響應解析器進行所有操作,包括建議如何使用appsync從DynamoDB返回JSON對象? ,但我們現在完全陷入困境。

在上述帖子中的任何建議均未奏效后,當前用於查詢的響應解析器已恢復為標准響應:

## '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日志中注意到,在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": ...

對於冗長的問題,我深表歉意,但我很沮喪。

您可以嘗試為包含所有可能字段的數據字段創建類型,然后將字段解析為與父類型對應的字段,或者嘗試實現graphQL接口

AWSJSON是JSON字符串類型,因此您將始終獲取字符串值(這是您的類型定義必須遵守的內容)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM