Typová serializace pro javascript rubrika: Programování: PHP

6 kohven
položil/-a 21.8.2015

Jak řešíte serializaci pro komunikaci mezi PHP a javascriptem, která by zachovala datové typy?

Jde mi o to, abych v PHP něčemu předal objekt, který bude obsahovat čísla, řetězce, DateTime a jiné další objekty a na klientu mi v javascriptu vypadl objekt, který bude obsahovat ty "samé" typy (s tím, že např. místo PHP DateTime bude JS Date, který ale taky obsahuje čas i datum). Něco jako typový json. Ideálně s definovatelným mapováním PHP typů na javascript typy. Mám nějaké vlastní řešení, ale má své mouchy a tuším, že už to někdo musel řešit.

Používáte třeba JSON schema? Nebo nějaké značkování do JSONu? Nebo jedete úplně bez JSON a používáte něco na základě XML? Nebo si to transformujete individuálně pro každý případ zvlášť (s tím, že víte, co kdy kam může přijít)?

EDIT:
Moje řešení je, že rekurzivně procházím položky objektu. Stringy nechávám jak jsou a hodnoty ostatních položek vyměním za objekt { xxxDataType: 'názevDatovéhoTypy', value: 'serializavanaHodnota'}. Kde xxxDataType je nějaké "klíčové slovo", které se nikde jinde nesmí použít jako properta. Ale už teď se mi to nelíbí. Možná by mi stačilo přenášet neupravený JSON a na druhé straně mít vždy uloženo nějaké schema, podle kterého by se to zpátky samo otypovalo. Což samozřejmě taky dokážu napsat, ale chtěl bych nějaké hotové řešení a hlavně best practice.

Komentáře

  • rmaslo : Píšeš, že nějaké řešení máš, akorát s ním nejsi spokojen. No mě by i přes to zajímalo. Klidně si i odpověz sám :-) Třeba nakonec bude dobré nebo někdo navrhne nějaké vylepšení, které se Ti hodí. 21.8.2015
odkaz
4 Jakub Kulhan
odpověděl/-a 21.8.2015

https://github.com/skrz/meta

Tohle je řešení pro PHP, ale stejně tak by šlo implementovat v Javascriptu. Ke každé datové třídě máme automaticky generovanou *Meta třídu, která přes reflexi ví, jaká je každá property typu a stará se serializaci/deserializaci dat do/z JSONu. Všechna API na straně PHP vrací objekty a k nim instanci meta třídy a před konečným odesláním do prohlížeče se objekt přes instanci meta třídy serializuje do potřebného typu.

Komentáře

  • Taco : Ty meta třídy jsou fajn. Ačkoliv mi čistě akademicky přijde, že je to příliš svázáno s JSON. Klidně by se to dalo zobecnit a de/serializovat to z libovolných dalších formátů. 23.8.2015
  • Jakub Kulhan : @Taco: Mrzí me, že z README to vypadá, že je podporován jen JSON. Je to právě naopak, JSON je jeden z formátů, do kterých se serializuje - teď je akorát jediný implementovaný. V nejbližší době bude implementovaný Protocol Buffers, protože ho začínáme používat na interní RPC. Dlouhou dobu tam již chci přidat serializaci/deserializaci XML a YAML. 24.8.2015
  • Taco : Tak to je super. 24.8.2015

Pro zobrazení všech 8 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.