Regex na zmazanie null poli z jsonu

Regex na zmazanie null poli z jsonu
« kdy: 26. 02. 2023, 20:10:25 »
Potrebujem z jsonu zmazat polia ktore maju null hodnotu. Treba brat do uvahy ale ciarky. Cize ked je pole 2+ v poradi, tak je pred nim ciarka. Ak je nasledovane dalsim polom, tak ho nasleduje ciarka ale ak je posledne v objekte tak ciarka nie je.
Neviete niekto ako to poriesit, s tym ze sa spravne zachyti aj escapovana uvodzovka v nazve pola?

Priklad:
Kód: [Vybrat]
{"a": null}
{"a": 123, "b": null}
{"a": 123, "b": null, "c": "foo"}
{"a": 123, "b": null, "c": "foo", "blby\"nazov": false}

Samozrejme json moze byt formatovany:
Kód: [Vybrat]
{
  "pole": null,
  "ine pole": false,
}
« Poslední změna: 26. 02. 2023, 20:12:51 od hknmtt »


Mlocik97

  • *****
  • 868
  • Ubunťák, JS dev.
    • Zobrazit profil
    • E-mail
Re:Regex na zmazanie null poli z jsonu
« Odpověď #1 kdy: 26. 02. 2023, 20:30:55 »
Musí to byť regex? Čo tak použiť `JSON.parse()` následne rekurzívne prejsť objektami, a zavolať `delete property` ak hodnota je null? Resp. ak to nie je JS, tak verím že každý z bežných jazykov má už v sebe nástroj na parsovanie JSON.

Re:Regex na zmazanie null poli z jsonu
« Odpověď #2 kdy: 26. 02. 2023, 20:42:14 »
mas pravdu, ked si to naparsujem do "blbej" mapy tak si ju rekurzivne viem prejst aj bez schemy a pomazat to a potom zase serializovat. asi lahsie riesenie nebude.

Re:Regex na zmazanie null poli z jsonu
« Odpověď #3 kdy: 26. 02. 2023, 21:20:43 »
Regulárním výrazem to nejde. Obecně programovací jazyky a podobné formáty (JSON, XML, XAML atd.) nejdou regulárními výrazy zpracovávat, jsou pro to potřeba silnější výrazové prostředky.

Re:Regex na zmazanie null poli z jsonu
« Odpověď #4 kdy: 26. 02. 2023, 21:31:32 »
Regulárním výrazem to nejde. Obecně programovací jazyky a podobné formáty (JSON, XML, XAML atd.) nejdou regulárními výrazy zpracovávat, jsou pro to potřeba silnější výrazové prostředky.

Slysel jste o rekurzivnich matchich?


mikrom

  • ****
  • 341
    • Zobrazit profil
    • E-mail
Re:Regex na zmazanie null poli z jsonu
« Odpověď #5 kdy: 26. 02. 2023, 21:59:04 »
Da sa na to pouzit jq - vid https://stedolan.github.io/jq/

Napriklad takto sa daju vylucit polia s null hodnotami z tohto JSONu
Kód: [Vybrat]
$ echo '{"foo":"bar", "baz": null, "spam": "eggs", "foobar":null}' | jq 'del(recurse(.[]?;true)|select(. == null))'
{
  "foo": "bar",
  "spam": "eggs"
}

Ja mam ale iba starsiu verziu jq, nakolko mam stale este dozivajuci Linux Mint 19.3
Kód: [Vybrat]
$ jq --version
jq-1.5-1-a5b5cbe

V novsej verzii jq od 1.6 sa to da asi urobit jednoduchsie...

Re:Regex na zmazanie null poli z jsonu
« Odpověď #6 kdy: 27. 02. 2023, 08:15:23 »
Co všichni s tím regexem mají. Parsovat s tím HTML chtějí, teď manipulovat JSON. Ty formáty mají své parsery, které jsou narozdíl od regexu, doufejme v dobrou implementaci, vědomy syntaxe daného jazyka.

To už je hotová UNIXárna. Vzít nic moc nástroj a dobastlit ho aby dělal něco nad jeho úroveň.

mikrom

  • ****
  • 341
    • Zobrazit profil
    • E-mail
Re:Regex na zmazanie null poli z jsonu
« Odpověď #7 kdy: 27. 02. 2023, 10:32:03 »
Samozrejme, ze sa na to da pouzit aj regex alebo kombinacia regexov:
Kód: [Vybrat]
$ echo '{"foo":"bar", "baz": null, "spam": "eggs", "foobar":null}' | sed -r 's/\"\S+\"\s*:\s*null\s*,*//g; s/,\s*}/}/g'
{"foo":"bar",  "spam": "eggs"}

Re:Regex na zmazanie null poli z jsonu
« Odpověď #8 kdy: 27. 02. 2023, 12:15:42 »
Samozrejme ze to ide aj regexom, ked tak vyraz odchytavajuci aj "blbe" kluce, ktore su v sulade so specifikaciou JSON:
Kód: [Vybrat]
,?\s*\"(\\.|[^\"])+\"\s*:\s*nullpieskovisko aj s prikladom tu https://regex101.com/r/Cj3vBX/1
toto ale odchyti len kluc:null v objektoch, pre to aby to odchytavalo aj null v poliach by to bol trochu komplikovanejsi vyraz.

Re:Regex na zmazanie null poli z jsonu
« Odpověď #9 kdy: 27. 02. 2023, 12:19:33 »
Regulárním výrazem to nejde. Obecně programovací jazyky a podobné formáty (JSON, XML, XAML atd.) nejdou regulárními výrazy zpracovávat, jsou pro to potřeba silnější výrazové prostředky.

Slysel jste o rekurzivnich matchich?

A slyšel jste někdy o tom, že to pak není regulární výraz? Pravdu máte tak nějak oba: regulárními výrazy to provést skutečně nejde, jenomže většina běžných implementací regulárních výrazů obsahuje podporu pro neregulární výrazy.

Re:Regex na zmazanie null poli z jsonu
« Odpověď #10 kdy: 27. 02. 2023, 13:50:46 »
jenomže většina běžných implementací regulárních výrazů obsahuje podporu pro neregulární výrazy.
Jenže i ta podpora pro silnější prostředky než jsou regulární výrazy v běžných implementacích nestačí na parsování běžných programovacích a podobých jazyků.

Jak je vidět např. na tomhle příkladu:

Samozrejme ze to ide aj regexom, ked tak vyraz odchytavajuci aj "blbe" kluce, ktore su v sulade so specifikaciou JSON:
Kód: [Vybrat]
,?\s*\"(\\.|[^\"])+\"\s*:\s*nullpieskovisko aj s prikladom tu https://regex101.com/r/Cj3vBX/1
toto ale odchyti len kluc:null v objektoch, pre to aby to odchytavalo aj null v poliach by to bol trochu komplikovanejsi vyraz.

Stačí si to zkusit na tomhle příkladu: https://regex101.com/r/SwsXx7/1

Problém samozřejmě není v jednoduchých příkladech, ty se dají vyřešit regulárním výrazem. Problém je, když se to, co hledáte, začne objevovat v části kódu, která má jinou gramatiku naž ta základní struktura. V JSONu tedy stringy, v klasických programvacích jazycích to nejsnáz rozbijí komentáře.