парсинг текста из AppleScript - PullRequest
       31

парсинг текста из AppleScript

0 голосов
/ 16 октября 2019

Я пытаюсь получить только один голос из ответа скрипта, который я запускаю внутри AppleScript с

do shell script "<mycommand>"

В принципе, все, что мне нужно, это сохранить "Ho1u8aA2p8jGuzEIZq8n" как переменную для последующего использования. .

Ниже приводится полная строка, которую я получаю.

Я думаю, что awk должно быть решением, но, к сожалению, мне не повезло с этим.

Любая идея окак этого добиться?

Ниже приводится полная строка, которую я получаю, это отчет о новой записи, созданной в firebase.

{"id":"Ho1u8aA2p8jGuzEIZq8n","data":{"spa_id":"0","os":"10.14.6","name":"Spa_Name","activity":"0","spa_email":"info@spa.com","serial":"C07XMRXWJYVW","nation":"Italy","spa_address":"Apliu Street 54, Hong Kong","ip_address":"192.168.2.1","global_unit_id":"0","city":"Perugia","branch":"Main","spa_unit_nr":"1","uid":"dev","spa_website":"www.spaname.com","continent":"Europe","spa_phone":"+852 3847569"}}

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Это можно передать по команде cut, с двойными кавычками в качестве разделителя полей.

script | cut -d'"' -f3
0 голосов
/ 20 октября 2019

Если любое из значений или ключей JSON должно содержать кавычку. ", тогда использование его в качестве разделителя для разделения текста с помощью инструмента, такого как cut, не будет работать. Аналогичным образом, запятая - еще один заманчивый символ, который следует рассматривать как потенциальный разделитель - представляет ту же проблему. Вы также потеряете ассоциации ключ-значение, что может быть помехой.

Скрипт ниже должен предоставить более полное решение, которое работает в более общих ситуациях, так как оно специально обслуживает строки JSON и преобразует ихв нативные типы данных AppleScript (a record), поэтому связь ключ-значение все еще существует (хотя и односторонняя).

set JSON to JSONStringToRecord from "{
    \"id\": \"Ho1u8aA2p8jGuzEIZq8n\",
    \"data\": {
        \"spa_id\": \"0\",
        \"os\": \"10.14.6\",
        \"name\": \"Spa_Name\",
        \"activity\": \"0\",
        \"spa_email\": \"info@spa.com\",
        \"serial\": \"C07XMRXWJYVW\",
        \"nation\": \"Italy\",
        \"spa_address\": \"Apliu Street 54, Hong Kong\",
        \"ip_address\": \"192.168.2.1\",
        \"global_unit_id\": \"0\",
        \"city\": \"Perugia\",
        \"branch\": \"Main\",
        \"spa_unit_nr\": \"1\",
        \"uid\": \"dev\",
        \"spa_website\": \"www.spaname.com\",
        \"continent\": \"Europe\",
        \"spa_phone\": \"+852 3847569\"
    }
}"


on JSONStringToRecord from input as text
    local input

    script objc
        use framework "Foundation"
        to unwrap()
            tell the current application to tell every reference in ¬
                (NSJSONSerialization's JSONObjectWithData:((NSString's ¬
                    stringWithString:input)'s dataUsingEncoding:4) ¬
                options:0 |error|:(reference)) to if it ≠ {} ¬
                then return its item 1 as {record, list, text}
        end unwrap()
    end script

    unwrap() in objc
end JSONStringToRecord

Я взял ваш вывод строки JSON и просто отформатировал его для облегчения чтения. Но переменная JSON в приведенном выше сценарии в вашей ситуации выглядит так, как если бы она определялась следующим образом:

set JSONString to do shell script "<mycommand>"
set JSON to JSONStringToRecord from the JSONString

Это должно вернуть следующую запись:

{
    |id|:"Ho1u8aA2p8jGuzEIZq8n",
    |data|:{
        spa_id:"0",
        os: "10.14.6",
        |name|: "Spa_Name",
        activity: "0",
        spa_email: "info@spa.com",
        serial: "C07XMRXWJYVW",
        nation: "Italy",
        spa_address: "Apliu Street 54, Hong Kong",
        ip_address: "192.168.2.1",
        global_unit_id: "0",
        city: "Perugia",
        branch: "Main",
        spa_unit_nr: "1",
        uid: "dev",
        spa_website: "www.spaname.com",
        continent: "Europe",
        spa_phone: "+852 3847569"
    }
}

, котораяотформатирован для удобства чтения и будет выглядеть более минимизированным в Редакторе сценариев , то есть:

{|id|:"Ho1u8aA2p8jGuzEIZq8n",|data|:{spa_id:"0",os:"10.14.6",|name|:"Spa_Name",activity:"0",spa_email:"info@spa.com",serial:"C07XMRXWJYVW",nation:"Italy",spa_address:"Apliu Street 54, Hong Kong",ip_address:"192.168.2.1",global_unit_id:"0",city:"Perugia",branch:"Main",spa_unit_nr:"1",uid:"dev",spa_website:"www.spaname.com",continent:"Europe",spa_phone:"+852 3847569"}}

Это, очевидно, очень похоже на строку JSON, с которой вы начали, но это будетВ Редакторе сценариев будет понятнее, что это не текст, а собственный объект данных, и теперь можно получить доступ к ключам в AppleScript, чтобы изолировать нужные значения в записи JSON. Следовательно:

|id| of JSON

даст вам "Ho1u8aA2p8jGuzEIZq8n". И чтобы получить один из более вложенных предметов, вы должны сделать это:

ip_address of |data| of JSON

, что даст вам "192.168.2.1".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...