由于我嵌套了 JSON 数据,如何对 getData() 中的行建模?

How to model the rows in getData() since i have nested JSON data?

我想为进入数据工作室的每个人显示这些字段: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]
    },
    ...   
]
*/

问题是

I'm not able to model the nested JSON data in Google Data Studio. I have the problem exactly in the "addresses" field. Could anyone tell me what format should be for the rows in this case?

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

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

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

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

既然你可以为每个名字生成多行,那就去做吧。

为此,您的字段定义 (=getSchema()) 应包括字段 address_idaddress_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:Return仅一个地址,忽略其他地址

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

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

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

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

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

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

只需在您的字段定义 (=getSchema()) 中创建一个名为 addresses 的字段,然后将 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_id1address_city1address_primary1address_id2、... address_primaryN.

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