[我有一个AppSync GraphQL API,该API向DynamoDB进行查询并返回JSON字符串,但是在我的响应映射模板中,我使用列出的$util.parseJson()
内置的here函数-但我仍然返回了查询窗口中以及在我的React应用程序中请求数据时的JSON字符串。
Schema file,我有一个普通的ID&Address字段,其类型为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
值的想法来自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" }
}
}
}
非常感谢您的帮助!
老问题,但以为我会添加一些注释...
AWSJSON是一个字符串值,将作为JSON解析到DynamoDB中,并在提取时再次进行字符串化。
因此AppSync期望输入一个字符串(字符串化的JSON),并将返回可以用JSON.parse
解析的字符串。
但是,在存储在DynamoDB中之前会先分析此数据。因此,与通过AppSync分别查询DynamoDB一样,您可以像查询对象一样查询它。与直接输入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解析/字符串化。