AWS AppSync:如何通过 DynamoDB 返回有效的 JSON



我有一个 AppSync GraphQL API,它可以对 DynamoDB 进行查询并返回 JSON 字符串,但是在我的响应映射模板中,我使用了此处列出的内置$util.parseJson()函数 - 但我仍然在查询窗口中以及在 React 应用程序中请求数据时返回一个 JSON 字符串。

架构文件,我有一个普通的 ID 和地址字段,类型为 AWSJSON。

type Venue {
id: ID!
address: AWSJSON
}

运行突变时,我通常通过快速JSON.stringify(addressObj)运行地址对象,并将对象格式化为字符串,并转义 \"\",这意味着它可以插入到 DynamoDB 中。

请求映射模板

{
"version": "2017-02-28",
"operation": "GetItem",
"key": {
"id": $util.dynamodb.toDynamoDBJson($ctx.args.id),
}
}

响应映射模板

#set($result = $ctx.result)
## address - parse back to JSON
#set($result.address = $util.parseJson($ctx.result.address))
## Return the result
$util.toJson($result)

创建新变量然后将值分配给parseJSON值的想法取自如何使用 appsync 从 DynamoDB 返回 JSON 对象?。因此,如下所示,我正在通过似乎是将其从字符串化 JSON 转换为对象的正确方法解析值 - 但它似乎不起作用。

当前响应:

{
"data": {
"getVenue": {
"id": "31538150",
"address": "{"lng":-1.54511300000001,"postcode":"LS1 5DL","short":"New Station St., LS1","lat":53.795231,"full":"16 New Station St, Leeds LS1 5DL, UK"}"
}
}
}

而我想要的回应是...

{
"data": {
"getVenue": {
"id": "31538150",
"address": { "lng": -1.54511300000001, "postcode": "LS1 5DL", "short": "New Station St., LS1", "lat": 53.795231, "full": "16 New Station St, Leeds LS1 5DL, UK" }
}
}
}

任何帮助将不胜感激!

老问题,但我想我会添加一些注释...

AWSJSON 是一个字符串值,将作为 JSON 解析到 DynamoDB 中,并在获取时再次字符串化。

因此,AppSync 需要一个字符串(字符串化的 JSON(作为输入,并将返回一个可以使用JSON.parse进行解析的字符串。

但是,此数据在存储在 DynamoDB 中之前会进行分析。因此,如果您单独查询 DynamoDB,而不是通过 AppSync 查询,那么您可以像查询对象一样查询它。与直接输入到 DynamoDB 相同。

在 AppSync 结果中获取 JSON 的唯一方法是定义 GraphQL 中的每个字段。有时,这可以通过重组数据来实现。例如,而不是存储:

{
bob: { age: 34 },
igor: { age: 124 }
}

这需要字符串化为 AWSJSON 字段。但是,它可以像这样重组:

[{
name: 'bob',
age: 34
}, { 
name: 'igor',
age: 123
}]

它可以在 GraphQL 中定义为这样的东西:

type User {
age: Int,
name: String
}

因此,现在可以从 GraphQL 中提取特定值,例如age,而无需涉及和 JSON 解析/字符串化。

最新更新