Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Serialize/Deserialize JSON na Java Objekt

Ahoj, mam takovou mozna blbou otazku :)

Chtel bych se zeptat jak je to s pouzitim Serialize/Deserialize pri tvorbe Objektu v Jave prostrednictvim JSON. Jde mi spis o to, jak to spravne delat?

Dejme tomu ze mam priklad. Mam inventar. Ten poslu na klient prostrednictvim JSON. Uzivatel ted bude chtit ze sveho inventare jeden predmet smazat/presunout (vytvaret samozrejme ne) tak si nejaky vybere. Tak poslu JSON v nejake takove podobe.

{"@type":"ItemData","Name":"Predmet","position":5}

to mi vytvori na serveru novou instanci ItemData pomoci Jacskon new ObjectMapper().readValue(json, ItemData.class). A ted mam v podstate dve instance jednoho predmetu pricemz je jedna pozmenena o pozici (ta nova). Jak to ted udelat spravne aby hlavni instance toho predmetu dostala tu novou pozici. Samozrejme pocitam stim ze server musi overit zdali je takovy presun itemu mozny. Ale dve instance stejneho predmetu mi prijdou jako oser. Na druhou stranu menit pozici uz v originalni instanci pri deserealizaci bude mit zas za nasledek ze nebudu moci kontrolovat jestli poslane hodnoty od klienta jsou pravdive (pravda?). Tedy, zdali je to mozne. Prece jen muze nejaky uzivatel podstrcit jiny JSON.

Asi je to chaoticky napsane, ale snad jste pochytili mou otazku.
Dekuji za odpoved.

Předmět Autor Datum
Neviem ci ti to pomoze, no ja pracujem v podstate so vsetkymi datami, cize mam napriklad zoznam item…
existpierre 09.08.2013 14:56
existpierre
Ahoj, dekuji, ale asi tam to reseni nevidim. Ja to mam nejak takto. Base public interface Base { @…
DanNek 09.08.2013 16:36
DanNek
A proč teda nerozšíříš instance o nějaké unikátní ID? Když ti z klienta přijde HTTP PUT, najdeš spra…
MaSo 10.08.2013 10:01
MaSo
Muzes hodit mensi priklad? Když si rozsirim instance o unikatni id tak mi to pomuze najit instanci k…
DanNek 10.08.2013 11:40
DanNek
Mozna by bylo lepsi pomoci te deseralize volat metody na tech instancich. Treba ze by trida Inventor…
DanNek 10.08.2013 11:47
DanNek
Bohužel nevím jaká je architektura aplikace, doména, ani jaké jsou operace nad doménovými objekty. A… poslední
MaSo 10.08.2013 12:40
MaSo

Neviem ci ti to pomoze, no ja pracujem v podstate so vsetkymi datami, cize mam napriklad zoznam itemov, ktory ako REST service vo forme JSON poskytujem js frameworku. cize ako tebe povedzme toto:

{"@type":"ItemData","Name":"Predmet","position":5}

odoslem data, cize doPost metodou odchytim JSON so vsetkymi itemami, unmarshalnem ich do java listu s itemami, rozdelim podla toho ako potrebujem a zase marshalnem do JSON.

cize tym sa mi uzavrie proces

rest service url: 6139
ulozenie dat so zmenami: 6140

Ahoj, dekuji, ale asi tam to reseni nevidim. Ja to mam nejak takto.

Base

public interface Base {
  @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "@type")
}

Player.class

public class Player {
  private final Inventory inventory;

  public Player() {
    this.inventory = new Inventory(inventoryDAO.getData());
    ....
  }
}

Inventory.class

public class Inventory implements Base {
  private List<ItemData> items = new ArrayList<>();

  ...
}

ItemData.class

public class ItemData implements Base {
  private String itemName;
  private double wieght;
  ...

  public String getName() {
    return itemName;
  }

  public String getWeight() {
    return weight;
  }
}

A pak mam jeste tridu ktera mi pobira instance trid ktere chci poslat na klienta. To mam v celku fajn, jen jak vracim data zpet na server (uz upravene o nejakou hodnotu, napriklad ta pozice) tak se mi vytvori nova instance ItemData kde jsou ty data z JSONu. Ale toto reseni se mi nelibi. Uz jen to ze musim mit novoun instanci tridy, pak porovnat dve instance (tu puvodni v Playerovem inventari a tu novou co se vytvorila na zaklade JSONu) , overit na serveru ze tento udaj si JSON nevycucal z prstu a muze ji takto zmenit a pak az provest zmenu.

Mozna to v tvem zpusobu je ale asi jsem to pak nepochopil.

A proč teda nerozšíříš instance o nějaké unikátní ID? Když ti z klienta přijde HTTP PUT, najdeš spravnou instanci na serveru, a změníš ji podle toho, co poslal klient (pokud změna bude validní).

Muzes hodit mensi priklad? Když si rozsirim instance o unikatni id tak mi to pomuze najit instanci kterou mam upravovat. Tedy porad zustavam u dvou instanci ktere musim navzajem porovnat. Takze kazdou promenou ktera se serializuje musim projit a zkontrolovat jestli nebyla zmenena od puvodni instance. Pokud ano tak zkontrolovat jestli je zmena platna a az pak promenu upravit o danou hodnotu. Nebo to jde lepe? Tohle mi prijde porad jako blbe reseni.

Mozna by bylo lepsi pomoci te deseralize volat metody na tech instancich. Treba ze by trida Inventory mela metodu itemMove(int pos) a ta by se volala pri deseralize, jen jsem jeste s volanim method timtpo zpusobem nepracoval. Asi pujdu googlit.

Bohužel nevím jaká je architektura aplikace, doména, ani jaké jsou operace nad doménovými objekty. Ani nevím, co používáš přesně, jestli Spring, nebo Javu EE, nebo něco jiného. Takže těžko radit...

Ale typicky bych to udělal nějak takto:

Controller:
- třída s metodami, které odpovídají HTTP metodám, pro CRUD operace
- zde by s měl metodu, která se zavolá, když klient posíla změnu, přijde ti nová instance Item
- podle obecných pravidel pro REST, by to mělo být metodou PUT

ItemRepository:
- třída, která se stará o práci s objekty Item
- má metody jako findById
- a taky metodu updateItem(Id, Item changes) - tuhle budeš volat při změně - najde si původní instanci Item a přesype tam data

Nevím,jestli to, co ti chodí z klienta na server jsou jenom delty (změny), nebo ti přijde celá instance Item i s tím co se nezměnilo. Pokud je to první případ, tak musíš updatovat jen ty změněné položky, ale raději bych to udělal tak, že by klient posílal celý Item, aby si mohl jenom přesypat data a nestarat se...

Validace
- použil bych nějakou implementaci JSR-303
- fieldy v doménových objektech anotuješ validačními anotacemi, a framework pohlídá že jsou objekty validní...

Zpět do poradny Odpovědět na původní otázku Nahoru