Если любое из значений или ключей 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"
.