How to enumerate the keys and values of a record in AppleScript

applescript, applescript-objc, json

Solution

I know it's an old Q but there are possibilities to access the keys and the values now (10.9+). In 10.9 you need to use Scripting libraries to make this run, in 10.10 you can use the code right inside the Script Editor:

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

This is no hack or workaround. It just uses the "new" ability to access Objective-C-Objects from AppleScript. Found this Q during searching for other topics and couldn't resist to answer ;-)

Update to deliver JSON functionality: Of course we can dive deeper into the Foundation classes and use the NSJSONSerialization object:

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

Have fun, Michael / Hamburg

Problem

When I use AppleScript to get the properties of an object, a record is returned. ``` 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:{}} ``` How can I iterate over the key/value pairs of the returned record so that I don't have to know exactly what keys are in the record? To clarify the question, I need to enumerate the keys and values because I'd like to write a generic AppleScript routine to convert records and lists into JSON which can then be output by the script.

Original source