4

这是用于测试 JSON 列表的JSON 数组快捷方式示例(在测试环境中使用有效的 API 令牌)。

通过快捷方式有一些“快速查看”和漂亮的打印字典操作,以便于阅读。

理想模型

使用“从列表中选择”操作,快捷方式用户从显示的列表中tags选择project. 用户可以tags从列表中选择多个(选择多个已启用)。然后,快捷方式执行“获取 URL 内容”操作以发送带有 JSON“请求正文”的 POST 请求。三个主要键是:(pid项目 ID)作为数字、created_with字符串和tags数组:

"data": {
    "pid": 123,
    "created_with": "Workflow",
    "tags": [ "bar1", "bar2", "bar3" ]
}

发送“选择的项目”数组

如果我将(从“从列表中选择”操作中选择的项目数组)中tags的值发送到“获取内容”操作,快捷方式会解释该列表。Chosen Item不是将列表作为字符串数组传递(如上面理想示例中所列),而是作为单个字符串传递,列表项由换行符分隔\n

"tags": [ "bar1\nbar2\nbar3" ]

注意:快捷方式示例使用“获取内容”操作来返回所有标签(包括通过发回这些长字符串创建的新标签),因此标签的选择已经过硬编码以便于使用。

如果用户选择并发送单个标签(例如bar2),则没有额外的修改(因为没有添加额外的新行),并且数组按预期构建(例如"tags": [ "bar2" ])。

发送“组合文本”“构建”数组

为了规避这一点,我尝试了“组合”和“文本”操作的组合来制作我自己的数组。

Combine 'Chosen Item' with 'Custom' ","

Text
"Combined Text"

Set variable 'tags' to "Text"

如果我这样做,Shortcuts 将获得“快乐逃脱”,结果选择三个标签如下:

"tags": [ "\"bar1\",\"bar2\",\"bar3\"" ]

沿着“转义双引号”的路径是疯狂(\\\",\\\")并将双引号更改为单引号将结果数组作为字符串发送:

"tags": [ "'bar1','bar2','bar3'" ]

这导致我查看“获取内容”操作的“请求正文”,因为在数组之前添加了双引号。'Get contents of' 动作有tags一个数组。

如果您深入研究tags数组项(在“获取内容”操作中),我可以添加的选项是文本、数字、数组、字典或布尔值。选择数组会在这个数组中创建一个数组(不是我想要的,它已经是一个数组),所以文本是最好的选择。这就是我挑出双引号的来源。知识就是力量。

从输入中获取字典

我还尝试使用“从输入获取字典”操作将数组转换为字典,将其解析为变量,然后将其放入“获取内容”操作请求中。我可以看到这项工作的唯一方法是,如果我通过“从输入获取字典”操作转换和构建所有请求正文,因为请求正文已经是“字典”类型 - 将文本项添加到字典会添加文本的键值对(我不能放入字典或数组)。

在“获取内容”操作中列出单个标签

我能想到的唯一其他解决方法是让“For Each”操作将每个选定的标签保存为一个单独的变量,并将每个标签传递到tags.

将每个变量添加到单独的变量中以作为tags数组下的文本列出似乎既麻烦又脆弱。如果可以使用“动态变量”,则ChosenTag_n可以在其中使用n所选标​​签的索引。现在,一个示例被硬编码在一个 biiiig 嵌套的 'If' 动作中(哦,不)。

从好的方面来说,这确实有效

"tags": [ "bar1", "bar2", "bar3" ]

ChosenTag_n...但是,如果“选择的项目”>变量数,它将“丢失数据” 。我还刚刚在单数变量中创建了自己的数组,并嵌套了“If”语句。双重叹息。

可能的解决方案和 TL;DR

理想情况下,从“从列表中选择”操作中选择的(多个)项目应格式化为数组,并且“获取内容”操作应按预期接受并解析数组。

我试图避免创建或写入文件,以及避免创建自己的自定义“请求正文”。

我只发现了关于同一主题的另一篇文章(Reddit) (现已存档)。

快捷方式是否无法正确解析数组/这是 iOS 14 解决和修复的问题,或者(更有可能)我是否马铃薯并且我错过了格式化数组的一些关键内容?

4

1 回答 1

1

我只是花了我不知道多少时间试图解决这个问题(通过快捷方式调用 Sonos API),我终于找到了一种方法。我希望实际上有一个更好的答案,但我还没有找到它!

解决方案是将其全部写入字典:使用Dictionary您遇到相同问题的操作(您不能将列表分配给字典),但Set Dictionary Value您可以使用操作(请注意,这实际上复制了您的字典并添加了值)。你可以用一个空的源字典来创建一个只有这个值的新字典。

下一步是发送这个字典;只需创建一个Get Contents of URLwith action = POST,并将请求正文设置为File并提供您刚刚制作的字典。

使用https://postman-echo.com/post(只是将您的请求回显给您的 api),Shortcuts(至少 iOS 15)似乎只是将提供的字典作为 JSON 发送,甚至添加正确的 Content-Type 请求标头。

于 2021-10-13T10:51:52.813 回答