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

问题描述 投票:2回答:1

[我有一个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" }
    }
  }
}

非常感谢您的帮助!

json amazon-web-services amazon-dynamodb apollo aws-appsync
1个回答
0
投票

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

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解析/字符串化。

© www.soinside.com 2019 - 2024. All rights reserved.