当我使用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,然后由脚本输出。
答案 0 :(得分:5)
我知道这是一个古老的Q,但现在有可能访问密钥和值(10.9+)。在10.9中,您需要使用Scripting库来进行此运行,在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
这不是黑客或解决方法。它只是使用“新”功能从AppleScript访问Objective-C-Objects。 在搜索其他主题时找到了这个Q,并且忍不住回答;-)
更新以提供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
玩得开心,迈克尔/汉堡
答案 1 :(得分:2)
如果您只想迭代记录的值,可以执行以下操作:
tell application "iPhoto"
repeat with value in (properties of album 1) as list
log value
end repeat
end tell
但是我不太清楚你真正想要达到的目标。
答案 2 :(得分:1)
基本上,AtomicToothbrush和foo说的是什么。 AppleScript记录更像是C结构,具有已知的标签列表,而不是具有任意键的关联数组,并且没有(体面的)语言方式来内省记录上的标签。 (即使有,你仍然有应用它们获取价值的问题。)
在大多数情况下,答案是“使用关联数组库。”但是,您对properties
值的标签特别感兴趣,这意味着我们需要一个hack。通常的做法是使用记录强制出错,然后解析错误消息,如下所示:
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
解析这一点,特别是在允许非英语语言环境的同时进行解析,这仍然是读者的练习。
答案 3 :(得分:1)
ShooTerKo的答案对我非常有帮助。
我会提出另一种可能性,我很惊讶我没有看到其他人提及。我必须在我的脚本中大量使用AppleScript和JSON,如果你可以在需要运行脚本的计算机上安装软件,那么我强烈建议JSONHelper基本上解决整个问题: