LINUX.ORG.RU

Ищу простой парсер JSON на перле

 ,


0

1

возможности затащить на дивайсину библиотеку нет, но есть возможность отредактировать текущий файл. Скрипт принимает и парсит json через post, в json-е всегда одномерный ассоциативный массив.

я сам наделал, но я не очень опытный составитель регулярок, оно то работает, то не работает. Мож у кого есть готовое что-нибудь подобное?

★★

Ответ на: комментарий от crutch_master

Массив чего? Если там цифры, то чем плох split?

конфиг. цифры буквы урлы всякие

чем плох split?

а ничем, я на нем и навелосипедил. но я корявый, думал мож все знают про какое проверенное решение, только мне не рассказывали )

pihter ★★ ()
Ответ на: комментарий от shell-script

Дай пример json'а.

{
  "DSS.EPGReceiver.ListenerAddress": "224.100.0.13:12346",
  "DSS.EPGReceiver.Mode": "Unicast",
  "DSS.EPGServer.ListenerAddress": "127.0.0.1:1001",
  "MWARE.DSS.BOOTSTRAP.LISTENER_PORT": "54321",
  "DHCPC.IPADDR": "192.168.216.50",
  "NORFLASH.MAC_ADDRESS": "00:03:e6:a5:96:90",
  "NORFLASH.DHCP": "false",
  "SETTINGS.GFX_RESOLUTION": "1080 HD",
  "SYSTEM.SOFTWARE_VERSION": "VITEC-EZTV-8.1.0.816",
  "AMINO_SYSTEM.FlashMounted": "true",
  "SETTINGS.HDMI_AUDIO_FORMAT": "",
  "NORFLASH.DNS": "192.168.216.252",
  "NORFLASH.SUBTITLES": "false",
  "DVR_FILEMANAGER_ENABLED": "Disabled",
  "SETTINGS.IR_BRAND": "",
  "MWARE.DSS.UPGRADE_MODE": "Manual",
  "NORFLASH.OUTPUT_RESOLUTION": "1080P50",
  "SYSTEM.EMS_STB_PROFILE": "DEFAULT",
  "SYSTEM.STB_MODEL": "EP5",
  "MWARE.DSS.BOOTSTRAP.LISTENER_IP": "224.100.0.3",
  "NORFLASH.IPADDR": "192.168.216.50",
  "DSS.EndpointHDR": "false",
  "DVR_FILEMANAGER_PASSWORD": "",
  "NORFLASH.SERIAL_ID": "72-5425992",
  "DHCPC.NETMASK": "255.255.255.0",
  "DHCPC.DNS": "192.168.216.252",
  "NETCONF.TIME_ZONE": "Asia/Kolkata",
  "NORFLASH.NETMASK": "255.255.255.0",
  "MWARE.DSS.ENDPOINT_CLUSTER": "eztv-test.vikra",
  "NORFLASH.TIME_SERVER": "eztv-win2016t3.eztv.vikra",
  "DHCPC.GATEWAY": "192.168.216.254",
  "SETTINGS.HDMI_VIDEO_FORMAT": "",
  "SETTINGS.BROWSER_HOMEPAGE": "https://192.168.216.220/eztv/tvmiddleware/index.html",
  "ENTONE_WEBENGINE.enjs_system_pref.MWARE%2EDSS%2EEZTV_AD": " ",
  "NORFLASH.GATEWAY": "192.168.216.254",
  "NORFLASH.OUTFMT": "HDMI"
}

лисапед:

sub parse_json {
    my $json_data = @in{'json_data'};
    my @json_pairs = split /,/, $json_data;
    foreach $json_pair (@json_pairs) {
      $json_pair =~ /"(.*?)"\:"(.*?)"/;
      $json_vars{$1} = $2;
    }
  }

pihter ★★ ()
Ответ на: комментарий от pihter

конфиг. цифры буквы урлы всякие

Так конфиг - это объект (ассоциативный массив) а не просто массив.

а ничем, я на нем и навелосипедил. но я корявый, думал мож все знают про какое проверенное решение, только мне не рассказывали )

Ну, split там, где в строках не встречаются разделители.

crutch_master ★★★★★ ()
Ответ на: комментарий от crutch_master

а я и говорил про ассоциативный массив, а не просто про массив

Ну, split там, где в строках не встречаются разделители.

ну, вроде, нигде не встречаются, вроде все работает. но вот это вот «вроде» не годится же

pihter ★★ ()
Ответ на: комментарий от crutch_master

И на чём он лагает?

ну, например, я его сначала дрессировал на тестовых данных (которые запостил), оно работало, а потом дал боевые — не сработало (оказалось браузер все в одну строку гонит, а у меня перевод строки в разделителе был).

ну я пофиксил, так бог знает чего я еще не учел

pihter ★★ ()
Ответ на: комментарий от pihter

Возьми любую json либу тогда, да не парься. А вообще, кроме запятых в строке я проблем не вижу. Ну и скобки в начале/конце обрезать.

crutch_master ★★★★★ ()
Последнее исправление: crutch_master (всего исправлений: 2)
Ответ на: комментарий от pihter

ну я пофиксил, так бог знает чего я еще не учел

Ну скорее всего ещё \" только осталось учесть. Ибо у вас даже числа и booleans как строки, и вряд ли будут коментарии...

vodz ★★★★ ()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от crutch_master

Чтобы запятые внутри строки не мешали, можно перед парсингом заменить их на что-нибудь.

# Что-то типа
s/",/"\n/g
# Или даже
s/","/"\n"/g

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

shell-script ★★★★★ ()

Попробуй туда что нить XS поставить и заюзать JSON::MaybeXS оно автоматом детектит наилучшие и потом уже откатываться если что на решение на перле .

pinachet ★★★★★ ()