РАЗМЕСТИТЕ список JSON [], используя "Выбрать из списка" (Выбрать несколько) в ярлыках
Вот пример ярлыка массива JSON для тестирования списков JSON (с рабочим токеном API в тестовой среде).
Для удобства чтения в ярлыке есть несколько действий "Быстрый просмотр" и " Хороший словарь печати".
Идеальная модель
Используя действие "Выбрать из списка", пользователи ярлыка выбирают из списка отображаемых tags
для project
. Пользователи могут выбрать несколькоtags
из списка (включен параметр "Выбрать несколько"). Затем Shortcuts выполняет действие "Получить содержимое URL-адреса", чтобы отправить запрос POST с "Телом запроса" JSON. Три основных ключа:pid
(идентификатор проекта) в виде числа, created_with
как строка, и tags
как массив:
"data": {
"pid": 123,
"created_with": "Workflow",
"tags": [ "bar1", "bar2", "bar3" ]
}
Отправка массива 'Chosen Items'
Если я отправлю tags
со значением из Chosen Item
(массив элементов, выбранных из действия "Выбрать из списка") до действия "Получить содержимое из", ярлыки интерпретируют этот список. Вместо того, чтобы передавать список как массив строк (как указано в идеальном примере выше), он передается как одна строка с элементами списка, разделенными\n
новые строки:
"tags": [ "bar1\nbar2\nbar3" ]
Примечание. В примере с ярлыком используется действие "Получить содержимое из" для возврата всех тегов (включая новые теги, созданные в результате отправки этих длинных строк), поэтому выбор тегов жестко запрограммирован для простоты использования.
Если пользователь выбирает и отправляет один тег (например, bar2
), лишнего искажения нет (так как не добавляются дополнительные новые строки), и массив строится так, как ожидалось (например, "tags": [ "bar2" ]
).
Отправить "Объединить текст" "встроенный" массив
Пытаясь обойти это, я попробовал комбинацию действий "Объединить" и "Текст", чтобы создать свой собственный массив.
Combine 'Chosen Item' with 'Custom' ","
Text
"Combined Text"
Set variable 'tags' to "Text"
Если я это сделаю, ярлыки станут "счастливыми", в результате чего будут выбраны следующие три тега:
"tags": [ "\"bar1\",\"bar2\",\"bar3\"" ]
На пути "избегания двойных кавычек" лежит безумие (\\\",\\\"
) и замена двойных кавычек на одинарные отправляет результирующий массив в виде строки:
"tags": [ "'bar1','bar2','bar3'" ]
Это заставляет меня взглянуть на "Тело запроса" действия "Получить содержимое", поскольку перед массивом добавляются двойные кавычки. Действие "Получить содержимое" имеетtags
как массив.
Если вы погрузитесь в tags
элемент массива (в действии "Получить содержимое"), я могу добавить следующие варианты: текст, число, массив, словарь или логическое значение. Выбор массива приведет к созданию массива в этом массиве (не то, что я хочу, это уже массив), поэтому текст - лучший вариант. Вот откуда я выделил двойные кавычки. Знание - сила.
Получить словарь из ввода
Я также попытался использовать действие "Получить словарь из ввода", чтобы преобразовать массив в словарь, проанализировать его как переменную, а затем перетащить в запрос действия "Получить содержимое". Единственный способ увидеть, как это работает, - это преобразовать и построить все свое тело запроса с помощью действия "Получить словарь из ввода", поскольку тело запроса уже имеет тип "словарь" - добавление текстового элемента в словарь. добавляет пару ключ-значение для текста (я не могу вставить словарь или массив).
Перечислите отдельные теги в действии "Получить содержимое"
Единственный другой обходной путь, который я могу придумать, - это действие "Для каждого" сохранять каждый выбранный тег как отдельную переменную и передавать каждый тег в последний элемент массива tags
.
Добавление каждого в отдельную переменную для вывода в виде текста под tags
массив кажется громоздким и хрупким. Если бы "динамические переменные" были возможны,ChosenTag_n
может использоваться там, где n
это индекс выбранного тега. На данный момент пример жестко запрограммирован во вложенном действии if (о нет).
С другой стороны, это действительно работает:
"tags": [ "bar1", "bar2", "bar3" ]
... однако он "потеряет данные", если "Выбранные элементы"> количества ChosenTag_n
переменные. Я также только что создал свой собственный массив в отдельных переменных и вложенных операторах If. Двойной вздох.
Возможные решения и TL;DR
В идеале (несколько) элементов, выбранных из действия "Выбрать из списка", должны быть отформатированы как массив, а действие "Получить содержимое" должно принимать и анализировать массив, как ожидалось.
Я пытаюсь избежать создания или записи в файл, а также не создавать свой собственный "Тело запроса".
Я нашел только еще одно сообщение (Reddit) по той же теме (сейчас заархивировано).
Ярлыки не анализируют массивы должным образом / это что-то, что iOS 14 решает и исправляет, или (что более вероятно) я картофель и мне не хватает чего-то ключевого в форматировании массивов?
1 ответ
Я просто не знаю, сколько времени я пытался понять это (вызывая Sonos API с помощью ярлыков), и я наконец нашел способ сделать это. Я надеюсь, что на самом деле есть лучший ответ, но я его не нашел!
Решение состоит в том, чтобы записать все это в словарь:
Dictionary
вы столкнетесь с той же проблемой (вы не можете назначать списки в словарь), но используя
Set Dictionary Value
действие, которое вы можете (обратите внимание, что это фактически копирует ваш словарь с добавленным значением). Вы можете сделать это с пустым исходным словарем, чтобы создать новый словарь только с этим одним значением.
Следующим шагом будет отправка этого словаря; просто создайте
Get Contents of URL
с действием = POST и установите тело запроса на
File
и предоставьте только что сделанный Словарь.
С использованием
https://postman-echo.com/post
(api, который просто повторяет ваш запрос обратно к вам), кажется, что Shortcuts (по крайней мере, iOS 15) просто отправляет предоставленный словарь как JSON и даже добавляет правильный заголовок запроса Content-Type.