首页 > 解决方案 > 由于我嵌套了 JSON 数据,如何对 getData() 中的行进行建模?

问题描述

我想显示这些字段:name, age, addresses_id, addresses_city, addresses_primary为每个进入数据工作室的人。

我的 JSON 数据

{
    "data": [
        {
            "name": "Lio",
            "age": 30,
            "addresses": [
                {
                    "id": 7834,
                    "city": "ML",
                    "primary": 1
                },
                {
                    "id": 5034,
                    "city": "MM",
                    "primary": 1
                }
             ]
         },
         
         {
            "name": "Kali",
            "age": 41,
            "addresses": [
                {
                    "id": 3334,
                    "city": "WK",
                    "primary": 1
                },
                {
                    "id": 1730,
                    "city": "DC",
                    "primary": 1
                }
             ]
         },
         
           ...
      ]
}

如果我不渲染该addresses字段就没有问题

return {
    schema: requestedFields.build(),
    rows: rows
  };
  
  //rows:
 /* 
 "rows": [
    {
      "values": ["Lio", 30]
    },
    {
      "values": ["Kali", 41]
    },
    ...   
]
*/

问题是

我无法在 Google Data Studio 中为嵌套的 JSON 数据建模。我在“地址”字段中遇到了问题。谁能告诉我这种情况下的行应该是什么格式?

标签: javascriptgoogle-apps-scriptgoogle-data-studiogoogle-apps-script-api

解决方案


如您所知,对于数据集的每个名称,您显然有不止一行(一个人有多个地址)。Data Studio 仅接受每个字段的单个数据,因为根本不支持数组。所以你需要为此努力。

有一些方法可以解决这个问题,但请始终牢记:

  • getSchema()应该返回连接器的所有可用字段(顺序并不重要,因为 Data Studio 总是按字母顺序对可用字段进行排序)
  • getData()应该返回一个值列表。但是这里的顺序是相关的:它应该与传递给的参数相同getData()(这意味着结果应该是动态的,有时你会返回所有值,有时不是,并且顺序可能会改变)。

解决方案 1:每条记录返回多行

由于您可以为每个名称生成多行,因此只需执行此操作。

为此,您的字段定义 (= getSchema()) 应包括 fieldsaddress_id和(如果您需要知道地址在列表中的位置,address_cityaddress_primary可以添加)。address_order

假设getData()所有字段的调用顺序与它们描述的顺序相同,rows数组应如下所示:

"rows": [
  {
    "values": ["Lio", 30, "7834", "ML", 1]
  },
  {
    "values": ["Lio", 30, "5034", "MM", 1]
  },
  {
    "values": ["Kali", 41, "3334", "WK", 1]
  },
  {
    "values": ["Kali", 41, "1730", "DC", 1]
  },
  ...
]

IMO,这是您数据的最佳解决方案。

解决方案 2:只返回一个地址,忽略其他地址

如果您更喜欢每人一行,您可以获取其中一个地址并仅显示它(通常是主要/主要地址,或第一个地址)。

为此,您的字段定义 (= )getSchema()应包括 fieldsaddress_id和.address_cityaddress_primary

假设getData()所有字段的调用顺序与它们描述的顺序相同,rows数组应如下所示:

"rows": [
  {
    "values": ["Lio", 30, "7834", "ML", 1]
  },
  {
    "values": ["Kali", 41, "3334", "WK", 1]
  },
  ...
]

解决方案3:返回所有地址,在一个字段中序列化

如果您确实需要所有信息但不想要复杂的方案,这将很有帮助。

addresses只需在您的字段定义 (= ) 中创建一个名为的字段getSchema(),然后将 JSON 作为字符串(或您想要的任何其他格式)写在那里。

假设getData()所有字段的调用顺序与它们描述的顺序相同,rows数组应如下所示:

"rows": [
  {
    "values": ["Lio", 30, "[{\"id\": 7834, \"city\": "ML", \"primary\": 1}, {\"id\": 5034, \"city\": \"MM\", \"primary\": 1}]"]
  },
  {
    "values": ["Kali", 41, "[{\"id\": 3334, \"city\": \"WK\", \"primary\": 1}, {\"id\": 1730, \"city\": \"DC\", \"primary\": 1}]"]
  },
  ...
]

此解决方案可能看起来毫无意义,但如果确实需要,可以稍后在 DataStudio 中使用 REGEX 与此数据进行交互。

解决方案 4:为每个地址创建不同的字段

如果您确定所有记录都有最大数量的地址(例如,在您的示例中,两个名称都有 2 个地址),您可以创建多个字段。

您的字段定义 (= getSchema()) 应包括字段address_id1, address_city1, address_primary1, address_id2, ... address_primaryN

我不会解释rows在这种情况下应该是什么样子,但不难猜测其他示例。


推荐阅读