Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: hknmtt 26. 02. 2023, 20:10:25

Název: Regex na zmazanie null poli z jsonu
Přispěvatel: hknmtt 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,
}
Název: Re:Regex na zmazanie null poli z jsonu
Přispěvatel: Mlocik97 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.
Název: Re:Regex na zmazanie null poli z jsonu
Přispěvatel: hknmtt 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.
Název: Re:Regex na zmazanie null poli z jsonu
Přispěvatel: Filip Jirsák 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.
Název: Re:Regex na zmazanie null poli z jsonu
Přispěvatel: APhacker_mob 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?
Název: Re:Regex na zmazanie null poli z jsonu
Přispěvatel: mikrom 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...
Název: Re:Regex na zmazanie null poli z jsonu
Přispěvatel: ondra05 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ň.
Název: Re:Regex na zmazanie null poli z jsonu
Přispěvatel: mikrom 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"}
Název: Re:Regex na zmazanie null poli z jsonu
Přispěvatel: Death Walker 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.
Název: Re:Regex na zmazanie null poli z jsonu
Přispěvatel: Martin Poljak 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.
Název: Re:Regex na zmazanie null poli z jsonu
Přispěvatel: Filip Jirsák 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.