Neviem, či rozumiem pripomienke, ani či si rozumiete navzájom, nebudem to podrobnejšie skúmať, ale inak v C++ sa {} po novom (už nejaký čas) používajú aj na inicializáciu objektu C++. Dá sa to nastaviť tak, že si to podľa argumentov vydedukuje aký objekt sa má vytvoriť. Takže to je syntax na vytvorenie objektu. Samozrejme, že ten kód ako taký nie je validný JSON, ktorý by sa dal do súboru s koncovkou .json skopírovať, ale vzniká tak jeho dátová reprezentácia a tá sa potom dá serializovať do validného formátu.
Nevím jak to má napsaný nlohmann, ale já to mám napsaný takto:
- vstupující pole není prázdné
- všechny prvky v poli jsou zase pole
- všechna vnořená pole mají právě dva prvky
- všechna vnořená pole mají jako první prvek string
Pokud je tohle splněno, pak se vytvoří objekt, který všechna vnořená pole změní na dvojice klíč-hodnota.
Má verze je zde
Ta moje verze umožňuje i samotný klíč bez hodnoty, protože to používám jako oddefinování hodnoty (když chci klíč smazat)
V zásadě takto nejde. Musel bys to vytvořit explicitně zavoláním json::array({..})
v mém podání můžeš použít json20::undefined na konci pole, který se do výsledného pole nedostane, ale rozbije tu podmínku.
{{"string","neco"},undefined} -> pole polí (undefined tam nebude).
Tenhle nástroj je nutné vidět jako zkratku, zejména pro psaní vnořených věcí, když vkládáš objekty do pole, které v sobě mají další objekty. Bez téhle zkratky bys musel každou úroveň anotovat
json::array{json::object{{"key, json::array{1,2,3} }} }