代码之家  ›  专栏  ›  技术社区  ›  Codename K

如何使用AppleScript从JSON文件中获取值?

  •  1
  • Codename K  · 技术社区  · 7 年前

    关于这个问题,

    How to download and get values from JSON file using VBScript or batch file?

    如何从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"]
    

    在MAC操作系统中使用AppleScript?

    以下是Windows中VBScript代码的一部分,由 Hackoo ,

    strJson = http.responseText
    Result = Extract(strJson,"(\x22(.*)\x22)")
    Arr = Split(Result,",")
    For each Item in Arr
        wscript.echo Item
    Next
    '******************************************
    Function Extract(Data,Pattern)
       Dim oRE,oMatches,Match,Line
       set oRE = New RegExp
       oRE.IgnoreCase = True
       oRE.Global = True
       oRE.Pattern = Pattern
       set oMatches = oRE.Execute(Data)
       If not isEmpty(oMatches) then
           For Each Match in oMatches  
               Line = Line & Trim(Match.Value) & vbCrlf
           Next
           Extract = Line
       End if
    End Function
    '******************************************
    

    在MAC OS AppleScript中,我只需要代码将JSON文件的值获取为一个字符串值数组。上面显示的VBScript上面的示例是JSON文件内容的样子。

    2 回复  |  直到 7 年前
        1
  •  1
  •   CJK    7 年前

    如何从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中)字符串值。您可以这样访问其中的特定项:

        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 .

        2
  •  2
  •   RobC Manuel Gonzalez    7 年前

    简短回答: 不幸的是,AppleScript没有提供内置的解析JSON的功能,这类似于JavaScript JSON.parse() 方法。

    以下是一些解决方案:

    • 解决方案1 :需要安装第三方插件,这可能并不总是可行的。
    • 解决方案2 :不需要安装任何第三方插件,而是使用macOS内置的工具/功能作为标准。

    解决方案1:

    如果您可以在用户系统上安装第三方插件,那么您可以安装 JSON Helper for AppleScript (如@user3439894在评论中所建议) .

    然后在AppleScript中使用它,如下所示:

    set srcJson to read POSIX file (POSIX path of (path to home folder) & "Desktop/foobar.json")
    tell application "JSON Helper" to set myList to read JSON from srcJson
    

    说明:

    1. 打开 第1行 我们阅读了 .json 文件并将其分配给名为 srcJson .

      注意 您需要更改路径部分(即。 Desktop/foobar.json )必要时。

    2. 打开 2号线 我们使用 JSON帮助程序 插件。这会将源JSON数组的每一项分配给一个新的AppleScript list . 结果AppleScript 列表 分配给名为 myList .


    解决方案2:

    通过使用macOS内置的工具作为标准,您还可以通过AppleScript执行以下操作。这假设您的JSON文件是 valid 仅包含一个数组:

    set TID to AppleScript's text item delimiters
    set AppleScript's text item delimiters to ","
    set myList to text items of (do shell script "tr ''\\\\n\\\\r''  ' ' <~/Desktop/foobar.json | sed 's/^ *\\[ *\"//; s/ *\" *\\] *$//; s/\" *, *\"/,/g;'")
    set AppleScript's text item delimiters to TID
    

    注意 :您需要更改路径部分(即。 ~/Desktop/foobar.json )必要时。

    而且,如果 .json文件 文件名包含一个空格,您需要用它来转义 \\ . 例如 ~/Desktop/foo\\ bar.json

    说明:

    1. 打开 第1行 AppleScript的当前 text item delimiters 分配给名为 TID .

    2. 打开 2号线 AppleScript's text item delimiters 设置为逗号-这将有助于从源JSON数组中提取每个单独的值并将每个值分配给新的AppleScript 列表 .

    3. 打开 3号线 外壳脚本 通过 do shell script 命令,它执行以下操作:

      • 读取源的内容 .json文件 通过读取 ~/Desktop/foobar.json/桌面/foobar.json . 此路径当前假定文件名为 foobar.json 居住在你的 Desktop 文件夹 (您需要将此路径更改为实际文件所在的任何位置) .

      • 内容 foobar.json格式 被重定向(注意 < 在文件路径之前),到 tr (即以下部分: tr ''\\\\n\\\\r'' ' ' ). 此转换将替换源内容中可能存在的任何换行符。 .json文件 具有空格字符的数组。这确保了 foobar.json格式 转换为一行。

        注意 :JSON数组可以在每个项之间包含新行,并且仍然有效,因此尽管问题中给出的示例JSON出现在一行上,但这不是此解决方案的要求,因为它也将处理多行。

      • 然后将一行文本通过管道传送到 sed s command 用于进一步加工(即: | sed 's/^ *\\[ *\"//; s/ *\" *\\] *$//; s/\" *, *\"/,/g;' ).

        的语法 s公司 命令是 's/regexp/replacement/flags' .

        让我们把每个 s公司 命令进一步了解正在发生的事情:

        • s/^ *\\[ *\"// 删除左方括号 [ ,其前面或后面可以是零个或多个空格字符,以及从字符串开头开始的以下双引号(即第一次出现)。

        • s/ *\" *\\] *$// 删除右方括号 ] ,其前面或后面可以是零个或多个空格字符,前面的双引号(即最后一个出现的引号)可以是字符串末尾。

        • s/\" *, *\"/,/g 用单个逗号替换单个逗号(前面可以有零个或多个空格,和/或后面跟着零个或多个空格)。

      • 上的起始部分 3号线 上面写着:; set myList to text items of ... 利用 text items 将字符串读入AppleScript 列表 使用逗号作为分隔符来确定 列表 . 结果数组被分配给名为 迈利斯特 .

    4. 打开 4号线 AppleScript的文本项分隔符 恢复到原来的价值。

    使用源JSON文件路径的变量。

    如果您想使用一个变量作为指向源的文件路径 .json文件 文件,然后您可以改为执行以下操作:

    set srcFilePath to quoted form of (POSIX path of (path to home folder) & "Desktop/foobar.json")
    
    set TID to AppleScript's text item delimiters
    set AppleScript's text item delimiters to ","
    set myList to text items of (do shell script "tr ''\\\\n\\\\r'' ' ' <" & srcFilePath & " | sed 's/^ *\\[ *\"//; s/ *\" *\\] *$//; s/\" *, *\"/,/g;'")
    set AppleScript's text item delimiters to TID
    

    注意 这与第一个例子非常相似。显著的区别是:

    • 在第一行,我们将文件路径分配给一个名为 srcFilePath .
    • 执行外壳脚本 我们参考 srcFilePath文件路径 变量。

    关于JSON转义特殊字符的附加说明: 解决方案2 保留任何JSON escaped special characters 可能出现在源JSON数组的值中。然而, 解决方案1 将解释它们。

    注意事项 解决方案2 当源JSON数组中的项包含逗号时,由于逗号用作 text item delimiters .