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

Tom*_*son 5 json amazon-web-services amazon-dynamodb apollo aws-appsync

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

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

type Venue {
  id: ID!
  address: AWSJSON
}
Run Code Online (Sandbox Code Playgroud)

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

请求映射模板

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

响应映射模板

#set($result = $ctx.result)

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

## Return the result
$util.toJson($result)
Run Code Online (Sandbox Code Playgroud)

创建新变量然后将值分配给该值的想法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\"}"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

而我想要的回应是......

{
  "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" }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏!

cyb*_*bat 4

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

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

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

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

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

{
   bob: { age: 34 },
   igor: { age: 124 }
}
Run Code Online (Sandbox Code Playgroud)

需要将其字符串化为 AWSJSON 字段。然而,它可以像这样重组:

[{
   name: 'bob',
   age: 34
 }, { 
   name: 'igor',
   age: 123
}]
Run Code Online (Sandbox Code Playgroud)

在 GraphQL 中可以这样定义:

type User {
  age: Int,
  name: String
}
Run Code Online (Sandbox Code Playgroud)

这样一来,人们现在就可以age从 GraphQL 中提取特定值,而无需涉及 JSON 解析/字符串化。