【发布时间】:2019-03-21 06:54:09
【问题描述】:
我有一个 AppSync GraphQL API,它对 DynamoDB 进行查询并返回 JSON 字符串,但是在我的响应映射模板中,我使用了 here 中列出的内置 $util.parseJson() 函数 - 但我仍然返回查询窗口中的 JSON 字符串以及在我的 React 应用程序中请求数据时。
架构文件,我有一个 AWSJSON 类型的普通 ID 和地址字段。
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 值的想法取自How return JSON object from DynamoDB with appsync?。因此,如下所示,我正在通过似乎将其从字符串化 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" }
}
}
}
非常感谢任何帮助!
【问题讨论】:
-
如果你看这个documentation
AWJSON代表一个JSON string。它还说they will automatically be parsed and loaded in the resolver mapping templates as Maps, Lists, or Scalar values rather than as the literal input strings. -
@LisaMShon 谢谢,所以不是在突变之前对 JSON 进行字符串化,您是否只需要简单地将 JSON 提供给突变,然后在解析器映射模板中执行一个步骤来对其进行字符串化,然后再保存进入 Dynamo?
-
@TomHanson 直觉表明您对
address的字符串化次数超出了您的预期。确认这一点的临时测试可能是#set($result.address = $util.parseJson($util.parseJson($ctx.result.address)))
标签: json amazon-web-services amazon-dynamodb apollo aws-appsync