Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: 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:
{"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:
{
"pole": null,
"ine pole": false,
}
-
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.
-
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.
-
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.
-
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?
-
Da sa na to pouzit jq - vid https://stedolan.github.io/jq/
Napriklad takto sa daju vylucit polia s null hodnotami z tohto JSONu
$ 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
$ jq --version
jq-1.5-1-a5b5cbe
V novsej verzii jq od 1.6 sa to da asi urobit jednoduchsie...
-
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ň.
-
Samozrejme, ze sa na to da pouzit aj regex alebo kombinacia regexov:
$ 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"}
-
Samozrejme ze to ide aj regexom, ked tak vyraz odchytavajuci aj "blbe" kluce, ktore su v sulade so specifikaciou JSON:
,?\s*\"(\\.|[^\"])+\"\s*:\s*null
pieskovisko 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.
-
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.
-
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:
,?\s*\"(\\.|[^\"])+\"\s*:\s*null
pieskovisko 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.