Как перечислить ключи и значения записи в AppleScript
Когда я использую AppleScript, чтобы получить свойства объекта, возвращается запись.
tell application "iPhoto"
properties of album 1
end tell
==> {id:6.442450942E+9, url:"", name:"Events", class:album, type:smart album, parent:missing value, children:{}}
Как я могу перебрать пары ключ / значение возвращаемой записи, чтобы мне не нужно было точно знать, какие ключи находятся в записи?
Чтобы прояснить вопрос, мне нужно перечислить ключи и значения, потому что я хотел бы написать общую процедуру AppleScript для преобразования записей и списков в JSON, которые затем могут быть выведены сценарием.
4 ответа
Я знаю, что это старый Q, но теперь есть возможность доступа к ключам и значениям (10.9+). В 10.9 для этого нужно использовать библиотеки сценариев, в 10.10 вы можете использовать код прямо в редакторе сценариев:
use framework "Foundation"
set testRecord to {a:"aaa", b:"bbb", c:"ccc"}
set objCDictionary to current application's NSDictionary's dictionaryWithDictionary:testRecord
set allKeys to objCDictionary's allKeys()
repeat with theKey in allKeys
log theKey as text
log (objCDictionary's valueForKey:theKey) as text
end repeat
Это не хак или обходной путь. Он просто использует "новую" возможность доступа к Objective-C-Objects из AppleScript. Нашел этот вопрос во время поиска других тем и не смог удержаться, чтобы ответить;-)
Обновление для предоставления функциональности JSON. Конечно, мы можем углубиться в классы Foundation и использовать объект NSJSONSerialization:
use framework "Foundation"
set testRecord to {a:"aaa", b:"bbb", c:"ccc"}
set objCDictionary to current application's NSDictionary's dictionaryWithDictionary:testRecord
set {jsonDictionary, anError} to current application's NSJSONSerialization's dataWithJSONObject:objCDictionary options:(current application's NSJSONWritingPrettyPrinted) |error|:(reference)
if jsonDictionary is missing value then
log "An error occured: " & anError as text
else
log (current application's NSString's alloc()'s initWithData:jsonDictionary encoding:(current application's NSUTF8StringEncoding)) as text
end if
Веселись, Майкл / Гамбург
Если вы просто хотите пройтись по значениям записи, вы можете сделать что-то вроде этого:
tell application "iPhoto"
repeat with value in (properties of album 1) as list
log value
end repeat
end tell
Но мне не очень понятно, чего вы действительно хотите достичь.
В основном, что сказал AtomicToothbrush и foo. Записи AppleScript больше похожи на структуры C с известным списком меток, чем на ассоциативный массив с произвольными ключами, и не существует (достойного) языкового способа для анализа меток в записи. (И даже если бы они были, у вас все равно была бы проблема применения их для получения значений.)
В большинстве случаев ответом будет "использовать вместо этого библиотеку ассоциативных массивов". Однако вас особенно интересуют метки из properties
значение, которое означает, что нам нужен взлом. Обычный - вызвать ошибку, используя запись, а затем проанализировать сообщение об ошибке, что-то вроде этого:
set x to {a:1, b:2}
try
myRecord as string
on error message e
-- e will be the string “Can’t make {a:1, b:2} into type string”
end
Синтаксический анализ, и особенно анализ, допускающий неанглийские локали, оставлен читателю в качестве упражнения.
Ответ ShooTerKo невероятно полезен для меня.
Я приведу еще одну возможность, я удивлен, но я не видел, чтобы кто-то еще упоминал. Мне приходится много ходить между AppleScript и JSON в моих сценариях, и если вы можете установить программное обеспечение на компьютеры, которые должны запускать сценарий, то я настоятельно рекомендую JSONHelper, чтобы в основном устранить всю проблему: