json 如何在AppleScript中枚举记录的键和值

klsxnrf1  于 2023-03-20  发布在  其他
关注(0)|答案(4)|浏览(153)

当我使用AppleScript获取对象的属性时,返回了一个 record

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,然后脚本可以输出JSON。

kyvafyod

kyvafyod1#

我知道这是一个老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-Object。在搜索其他主题时发现了这个问题,并忍不住回答了这个问题;- )

***更新以提供JSON功能:***当然,我们可以更深入地研究基础类并使用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

玩得开心,迈克尔/汉堡

ffdz8vbo

ffdz8vbo2#

如果你只想遍历记录的值,你可以这样做:

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

但我不太清楚你真正想要的是什么。

bcs8qyzn

bcs8qyzn3#

基本上,正如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

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

bnl4lu3b

bnl4lu3b4#

ShooTerKo的回答对我帮助很大。
我将提出另一种可能性,我很惊讶没有看到其他人提到,但是,我必须在我的脚本中在AppleScript和JSON之间切换很多次,如果您可以在需要运行脚本的计算机上安装软件,那么我强烈推荐JSONHelper,基本上可以解决整个问题:
https://github.com/isair/JSONHelper

相关问题