4

当我使用 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

4 回答 4

7

我知道这是一个旧的 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

这不是破解或解决方法。它只是使用“新”功能从 AppleScript 访问 Objective-C-Objects。在搜索其他主题的过程中发现了这个问题,无法抗拒回答;-)

更新以提供 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

玩得开心,迈克尔/汉堡

于 2015-04-09T18:12:46.563 回答
2

如果您只想遍历记录的值,可以执行以下操作:

tell application "iPhoto"
    repeat with value in (properties of album 1) as list
        log value
    end repeat
end tell

但我不太清楚你真正想要实现什么。

于 2013-08-05T17:04:20.270 回答
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

解析这个,特别是在允许非英语语言环境的情况下解析这个,留给读者作为练习。

于 2013-08-05T23:46:03.587 回答
1

ShooTerKo 的回答对我非常有帮助。

我会提出另一种可能性,但我很惊讶我没有看到其他人提到。在我的脚本中,我必须经常在 AppleScript 和 JSON 之间切换,如果您可以在需要运行脚本的计算机上安装软件,那么我强烈推荐 JSONHelper 基本上可以解决整个问题:

https://github.com/isair/JSONHelper

于 2015-04-09T19:19:17.180 回答