如何从如下所示的 JSON 文件中获取值,
["AA-BB-CC-MAKE-SAME.json","SS-ED-SIXSIX-TENSE.json","FF-EE-EE-EE-WW.json","ZS-WE-AS-FOUR-MINE.json","DD-RF-LATERS-LATER.json","FG-ER-DC-ED-FG.json"]
如果您的意思是您写的内容,并且 JSON 文件的内容是单个数组中的六个字符串列表,格式为一行,那么最简单的方法是将其视为文本,修剪开头和右方括号,然后在每次出现, 时分隔其字段。最后,每个单独的文本项也可以修剪周围的引号。
检查 VBScript,看起来它使用了一个非常相似的过程,尽管使用的是正则表达式,AppleScript 没有这种功能,但在这种简单的情况下并不是特别需要。
假设上面的 JSON 数组存储在您桌面上名为“myfile.json”的文件中。那么:
set home to the path to home folder
set f to the POSIX path of home & "Desktop/myfile.json"
set JSONstr to read POSIX file f
# Trim square brackets
set JSONstr to text 2 thru -2 of JSONstr
# Delimit text fields using comma
set the text item delimiters to ","
set Arr to the text items of JSONstr
# Trim quotes of each item in Arr
repeat with a in Arr
set contents of a to text 2 thru -2 of a
end repeat
# The final array
Arr
我只需要将 JSON 文件的值获取到单个字符串值数组的代码。上面显示的 VBScript 示例是 JSON 文件内容的样子。
变量Arr 现在包含字符串值的数组(在AppleScript 中称为lists)。您可以像这样访问其中的特定项目:
item 2 of Arr --> "SS-ED-SIXSIX-TENSE.json"
更通用的解决方案
我决定在 AppleScript 中包含一种更高级的处理 JSON 的方法,部分原因是我最近一直在进行大量的 JSON 处理,而这对我的事件视界来说是全新的;还要证明,使用 AppleScriptObjC,解析甚至非常复杂的 JSON 数据不仅是可能的,而且非常简单。
我认为您在这种特定情况下不需要它,但它可能对未来的某些情况有用。
该脚本包含三个部分:它首先导入相关的 Objective-C 框架,该框架赋予 AppleScript 额外的功能;然后,我定义了实际的处理程序本身,称为JSONtoRecord,我将在下面进行描述。最后是脚本的底部,您可以在其中输入代码并使用它做任何您想做的事情:
use framework "Foundation"
use scripting additions
--------------------------------------------------------------------------------
property ca : a reference to current application
property NSData : a reference to ca's NSData
property NSDictionary : a reference to ca's NSDictionary
property NSJSONSerialization : a reference to ca's NSJSONSerialization
property NSString : a reference to ca's NSString
property NSUTF8StringEncoding : a reference to 4
--------------------------------------------------------------------------------
on JSONtoRecord from fp
local fp
set JSONdata to NSData's dataWithContentsOfFile:fp
set [x, E] to (NSJSONSerialization's ¬
JSONObjectWithData:JSONdata ¬
options:0 ¬
|error|:(reference))
if E ≠ missing value then error E
tell x to if its isKindOfClass:NSDictionary then ¬
return it as record
x as list
end JSONtoRecord
--------------------------------------------------------------------------------
###YOUR CODE BELOW HERE
#
#
set home to the path to home folder
set f to the POSIX path of home & "Desktop/myfile.json"
JSONtoRecord from f
--> {"AA-BB-CC-MAKE-SAME.json", "SS-ED-SIXSIX-TENSE.json", ¬
--> "FF-EE-EE-EE-WW.json", "ZS-WE-AS-FOUR-MINE.json", ¬
--> "DD-RF-LATERS-LATER.json", "FG-ER-DC-ED-FG.json"}
在脚本的底部,我调用了JSONtoRecord 处理程序,并将myfile.json 的位置传递给它。此处理程序的好处之一是,文件是全部格式化在一行还是多行都无关紧要。它还可以处理复杂的嵌套 JSON 数组。
在这些情况下,它返回的是本机 AppleScript record 对象,所有 JSON 变量都作为属性值存储在记录中。访问变量就变得非常简单了。
这实际上正是一些人已经提到的 JSON Helper 应用程序在后台所做的。
一个标准(除了包含有效 JSON 数据的 JSON 文件)是文件的路径是完整的 posix 路径,例如/Users/CK/Desktop/myfile.json,不是~/Desktop/myfile.json,或者更糟糕的是Macintosh HD:Users:CK:Desktop:myfile.json。