æè¿ãJavaãªããžã§ã¯ããJSONããã¹ã圢åŒïŒã·ãªã¢ã«åïŒããã³éå€æïŒéã·ãªã¢ã«åïŒã«å€æããããã«èšèšãããGoogle
Gsonã©ã€ãã©ãªã䜿çšããå¿
èŠããããŸããã å€ãã®å ŽåãGsonã䜿çšããå Žåãæšæºã©ã€ãã©ãªèšå®ã§ååã§ãããå€æããã»ã¹ãã«ã¹ã¿ãã€ãºããå¿
èŠãããå ŽåïŒç§ã®å Žåãå«ãïŒããããŸãã
Gsonã䜿çšããåŸããã®ãã¥ãŒããªã¢ã«ãäœæããããšã«ããŸããããã®ãã¥ãŒããªã¢ã«ã§ã¯ãäŸã䜿çšããŠã©ã€ãã©ãªãæäœããåçã説æããŸãã æçš¿ã¯æ¯èŒçé·ãããšãå€æããŸããããã¹ããŒãªãŒã®è«ççäžè²«æ§ã®ããã«åå²ããããããŸããã
æåã«ããµããžã§ã¯ãé åãéžæããå¿
èŠããããŸãã ã©ãããããããããŒã ã®åãé¢ãã®èããé ã«æµ®ãã¶ã®ãããããŸããã å®éããªãã§ããïŒ

ã¯ããèšäºã«å«ãŸãããã¹ãŠã®ã³ãŒãã¯GitHubã§èŠã€ããããšãã§ããŸãïŒ
https :
//github.com/treble-snake/gson.dwarvesã¯ã©ã¹å³ä»¥å€ã®ç»åã¯ã
httpïŒ //www.javacreed.comã®Gsonã«é¢ããäžé£ã®èšäºããåŒçšãããŠã
ãŸã ã
ã¯ããã«
ãã¯ãŒãã«ã€ããŠ
ã ããããåéãã§ããã¯æããã§ã-ããã¯ããçš®ã®ããŒã ã§ãã ãããããã¯ãŒãèªèº«ã¯ã©ãã§ããïŒ ããŒã ãç¹åŸŽä»ããæãéèŠãªè©³çŽ°ã¯ããã¡ãããã²ãã§ãã gnomeã®ã²ãã®ç¹åŸŽãšåé¡ã¯é·ãé説æã§ããŸãããç°¡åã«ããããã«ãgnomeã«å£ã²ãããããã©ãããã²ãããããã©ãããããã³ãããã®è²ãå®çŸ©ããŸãã ããã«ãååãšå¹Žéœ¢-ããããªãã§ã å人çãªäœããè¿œå ããå°äººãæŒé£ãé£ã¹ããšèšããŸãã ãããŠæåŸã«ãæŠåšã gnomeã¯å€ãã®æŠåšãæã€ããšãã§ããã·ã³ãã«ã«ããããšããç¬èªã®ååãšèµ·æºãæã€ãŠããŒã¯ã«ããããšãã§ããŸãã
çµæã¯æ¬¡ã®ããã«ãªããŸãã

ãã¡ã€ã³ã¯ã©ã¹ã®èª¬æç°¡æœã«ããããã«ã1ã€ã®ãªã¹ãã§ãã¹ãŠã®ã¯ã©ã¹ãæäŸããŸãã
public class DwarvesBand { List<Dwarf> dwarves = new LinkedList<>();
3人ã®åå è
ãè¿œå ããŠgnomeäŒç€ŸãåæåããŸãïŒ
ãã¹ãŠã®ãã£ã©ã¯ã¿ãŒã¯æ¶ç©ºã®ãã®ã§ãããå¶ç¶ã®äžèŽã¯ã©ã³ãã ã§ã ïŒã
public class BandUtil { public static DwarvesBand createBand() { DwarvesBand company = new DwarvesBand(); Dwarf tmpDwarf; tmpDwarf = new Dwarf("Orin", 90); tmpDwarf.setLunch("Ale with chicken"); tmpDwarf.setFacialHair(new FacialHair(true, true, "black")); tmpDwarf.addWeapon(new UniqueWeapon("sword", "Slasher", "Gondolin")); tmpDwarf.addWeapon(new UniqueWeapon("shield", "Oaken Shield", "Moria")); tmpDwarf.addWeapon(new Weapon("dagger")); company.addDwarf(tmpDwarf); tmpDwarf = new Dwarf("Kori", 60);
ããã
ããã©ã«ãã§
ãã®ãããç§ãã¡ã¯JSON圢åŒã§ããŒã ã«é¢ããæ
å ±ãååŸããããšèããŠããŸãã æãç°¡åãªæ¹æ³ãè©ŠããŠã¿ãŸããã-åãååã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŠ
toJson()
ã¡ãœãããåŒã³åºãããšã«ãããGsonã©ã€ãã©ãªã®æšæºãã©ã¡ãŒã¿ãŒã䜿çšããŸãã
DwarvesBand band = BandUtil.createBand(); Gson gson = new GsonBuilder() .setPrettyPrinting() .create(); String json = gson.toJson(band);
å®éã«ã¯ã
Gson
ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã
new
æŒç®åã䜿çšããŠäœæ
Gson
ãŸãããåºåJSONã¯ãã©ãŒããããããŠããªããããã¢ããªã±ãŒã·ã§ã³éã§ããŒã¿ã亀æããã®ã«é©ããŠããŸãïŒåœ¢æãéããééãå°ãªããªããŸãïŒãã人éã®ç¥èŠã«ã¯é©ããŠããŸããã ãããã£ãŠãç¹å¥ãª
GsonBuilderã䜿çšããŠ
setPrettyPrinting()
ã¡ãœãããåŒã³åºããåºåJSONã次ã®åœ¢åŒã§è¡šç€ºã§ããããã«ããŸããã
ããã©ã«ãã§ã·ãªã¢ã©ã€ãºåŸã®JSON { "dwarves": [ { "name": "Orin", "facialHair": { "haveBeard": true, "haveMustache": true, "color": "black" }, "weapons": [ { "name": "Slasher", "origin": "Gondolin", "type": "sword" }, { "name": "Oaken Shield", "origin": "Moria", "type": "shield" }, { "type": "dagger" } ], "lunch": "Ale with chicken", "dwarfAge": 90 }, { "name": "Kori", "facialHair": { "haveBeard": false, "haveMustache": true, "color": "red" }, "weapons": [ { "type": "mace" }, { "type": "bow" } ], "dwarfAge": 60 }, { "name": "Billy Bob", "facialHair": { "haveBeard": false, "haveMustache": false, "color": "" }, "weapons": [], "lunch": "Ale with chicken and potatoes, tea with some cakes", "dwarfAge": 45 } ] }
ããŠãããªãã¯ãã§ã«ããã§äœæ¥ããããšãã§ããŸããããããããªããããã«ã€ããŠèãããªãã°ãããã€ãã®ã³ã¡ã³ãããããŸãïŒ
- ãdwarfAgeããšã¯ã©ã®ãããªæããªããããã£åã§ããïŒ ãããŠãç§ãã¡ãããŒã ã«ã€ããŠè©±ããŠããããšã¯æããã§ãã ããã¯ã¡ããã©ãã®å¹Žéœ¢ããã£ãšè¯ãèŠããŠããã ãããšããããšã§ãã
- ãããããæŒé£ã«é¢ããæ
å ±ã¯ããã»ã©éèŠã§ã¯ãããŸããã 圌女ãªãã§ãã§ããŸãã
- ããã²ãã®èª¬æã¯ãªããšãªã也ããŠããã®ã§ãããã¯èš±ãããŸããã å®å
šãªæãã€ãŸããèµ€ã²ããšå£ã²ãããŸãã¯ãé»å£ã²ãããªã©ã®è¡ã§èšè¿°ããå¿
èŠããããŸãã
- åŸæ¥ã®æŠåšã«å¯ŸããŠåäžã®ãã¿ã€ããããããã£ãæã€ãªããžã§ã¯ããååŸããå¿
èŠãããã®ã¯ãªãã§ããïŒ è²»çšã¯ããã1è¡ã§ãã
ãã¹ãŠã®ã³ã¡ã³ããèæ
®ã«å
¥ãããšã次ã®åœ¢åŒã§gnomeã«é¢ããæ
å ±ã衚瀺ã§ããŸãã
{ "name": "Orin", "facialHair": "Black beard and mustache", "weapons": [ { "name": "Slasher", "origin": "Gondolin", "type": "sword" }, ... , "dagger" ], "age": 90 }
泚é
Gsonã¯ãã·ãªã¢ã«åãèšå®ããããã®äŸ¿å©ãª
泚éãæäŸããŸãã 圌ããç§ãã¡ãå©ããããšãã§ãããã©ããèŠãŠã¿ãŸãããã
æåã®åé¡ã§-ã¯ãã
SerializedNameã¢ãããŒã·ã§ã³ãrespã«è¿œå ããããšã§ãããããã£ã®åºååãå€æŽã§ããŸãã ã¯ã©ã¹ãã£ãŒã«ãã ã€ãŸããããããããšã§ïŒ
@SerializedName("age") private int dwarfAge;
ãdwarfAgeãã§ã¯ãªããageããšããååã®ããããã£ãååŸããŸãã
ãã§ã«æªããããŸãããå
ã«é²ã¿ãŸãããã
lunch
ãã£ãŒã«ããé€å€ããŸãã ãŸããããã«
transientããŒã¯ãŒããè¿œå ããããšã§ãããè¡ãããšãã§ããŸãããã®å Žåãã·ãªã¢ã«åäžã«ãã£ãŒã«ãã¯èæ
®ãããŸããã ãããããããæ£ããæ¹æ³ã§ãããšããäºå®ã§ã¯ãããŸããã ããã§æŒé£ã«é¢ããæ
å ±ãå¿
èŠãªããšããäºå®ã¯ãä»ã®ã·ãªã¢ã«åã§ã¯å¿
èŠãªããšããæå³ã§ã¯ãããŸããã
ãã1ã€ã®æ¹æ³ã¯ã
Exposeã¢ãããŒã·ã§ã³ã䜿çšããããšã§ãã
GsonBuilder.excludeFieldsWithoutExposeAnnotationïŒïŒã¡ãœãããšé£æºããŠã®ã¿æ©èœããŸãããã®ã¡ãœããã¯ãExposeã¢ãããŒã·ã§ã³ã
æããªããã¹ãŠã®ãã£ãŒã«ãã®åŠçããé€å€ããŸãã ãã ãã1ã€ã®ãã£ãŒã«ããé€å€ããã«ã¯ãä»ã®ãã¹ãŠã®ãã£ãŒã«ãã«æ³šéãè¿œå ããå¿
èŠããããŸãã 䟿å©ãããŸãããïŒ
ã«ã¹ã¿ã ã·ãªã¢ã©ã€ã¶ãŒ
ããæè»ãªæ¹æ³ã¯ãç¹å®ã®ã¿ã€ãã®ãªããžã§ã¯ããã·ãªã¢ã«åããç¬èªã®ã¯ã©ã¹ãäœæããããšã§ãã ãããè¡ãã«ã¯ã
JsonSerializer <T>ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããå¿
èŠããããŸããTã¯åŠçããããªããžã§ã¯ãã®ã¿ã€ãã§ãã åäžã®ã€ã³ã¿ãŒãã§ãŒã¹ã®
serialize()
ã¡ãœãããèããŠãã ããïŒ
JsonElement serialize(T src, Type typeOfSrc, JsonSerializationContext context)
次ã®3ã€ã®ãã©ã¡ãŒã¿ãŒãå¿
èŠã§ãã
T src
å®éã«ã¯ãã·ãªã¢ã©ã€ãºå¯èœãªãªããžã§ã¯ããType typeOfSrc
ã·ãªã¢ã©ã€ãºå¯èœãªãªããžã§ã¯ãã®ã¿ã€ããJsonSerializationContext context
-ã·ãªã¢ã«åã³ã³ããã¹ãã JsonSerializationContext
ã€ã³ã¿ãŒãã§ãŒã¹ãæ©èœçã§ããã1ã€ã®ã¡ãœãããšserialize()
ãå«ãŸããŠããŸãã ã·ãªã¢ã«åå¯èœãªãªããžã§ã¯ãã«å«ãŸããéããªããã£ãããŒã¿ãåŠçããããã«äœ¿çšããå¿
èŠããããŸãïŒãããŠãããããå°ãäœãããŸãïŒã ã³ã³ããã¹ãã¯ãå
ã®Gsonãªããžã§ã¯ãã®ãã¹ãŠã®èšå®ïŒç»é²æžã¿ã®ã·ãªã¢ã©ã€ã¶ãŒãªã©ãå«ãïŒãç¶æ¿ããŸãã
ã¡ãœããã®æ»ãããŒã¿åã¯
JsonElement
ã§ãã ããã¯ã次ã®å³ã«ç€ºã4ã€ã®å®è£
ãæã€æœè±¡ã¯ã©ã¹ã§ãã

JsonNull
å®éã«ã¯null
ãã¥ãŒJsonPrimitive
æååãæ°å€ãªã©ã®ããªããã£ãåã®è¡šçŸJsonArray
- JsonArray
åã®å€ãã®ãªããžã§ã¯ãã List<JsonElement>
ãšèããããšãã§ããŸãã èŠçŽ ã¯ä»»æã®JsonElement
å®è£
ã§ãããæ··ååããµããŒããããŠããŸããJsonObject
å€æ°ã®ããŒãšå€ã®ãã¢ãããã§ãããŒã¯æååã§ãããå€ã¯åã³JsonElement
åã®ãªããžã§ã¯ãã§ãã æ§é Map<String, JsonElement>
䌌ãŠããŸãã
次ã®å³ã¯ãã¿ã€ãã®çµã¿åããã®äŸã瀺ããŠããŸãã

ããŒã ãã·ãªã¢ã«åããæé
ããã§ãååãªçè«ãæåŸã«ã·ãªã¢ã©ã€ãºããŸãããïŒ
ãŸããã«ã¹ã¿ã åŠçãå¿
èŠãªããŒã¿åã¯ããã€å¿
èŠã§ããïŒ
ãŸãããã¡ãããããã¯gnome-
Dwarf
ãèšè¿°ããã¯ã©ã¹ã§ãã
第äºã«ãããã²ããšå£ã²ãã®ã¯ã©ã¹ã¯
FacialHair
ã§ãã
Weapon
ãç¹ã«
UniqueWeapon
ãããã«èµ·å ããŸãããä»ã®ãšããã¯ããã©ã«ãã®åŠçã«ä»»ããŸãããã
ãããã£ãŠã
JsonSerializer
2ã€ã®å®è£
ãå¿
èŠ
JsonSerializer
ã ãããã¯éåžžã«ãã䌌ãŠããŸãïŒ
public class DwarfSerializer implements JsonSerializer<Dwarf> { @Override public JsonElement serialize(Dwarf src, Type typeOfSrc, JsonSerializationContext context) {
GsonãããŒã ãåŠçãããšãã«ã·ãªã¢ã©ã€ã¶ãŒã䜿çšããã«ã¯ã次ã®ããã«
GsonBuilder
ã¯ã©ã¹ã®
registerTypeAdapter()
ã¡ãœããã䜿çšããŠ
registerTypeAdapter()
ããå¿
èŠããããŸãã
Gson gson = new GsonBuilder() .setPrettyPrinting() .registerTypeAdapter(Dwarf.class, new DwarfSerializer()) .registerTypeAdapter(FacialHair.class, new FacialHairSerializer()) .create();
ã²ããšå£ã²ã
ã²ããšå£ã²ãã®åŠçããå§ããããšã«æ°ä»ããŸãã 以äžã«å®å
šãªã³ãŒãã瀺ããŸãã詳现ã«ã€ããŠã¯ã以äžã§èª¬æããŸãã
public class FacialHairSerializer implements JsonSerializer<FacialHair> { @Override public JsonElement serialize(FacialHair src, Type typeOfSrc, JsonSerializationContext context) { if (!src.isHaveBeard() && !src.isHaveMustache()) return new JsonPrimitive("is he really a dwarf?"); List<String> list = new LinkedList<String>(); if (src.isHaveBeard()) { list.add("beard"); } if (src.isHaveMustache()) { list.add("mustache"); } return new JsonPrimitive( new StringBuilder(src.getColor()) .append(" ") .append(StringUtils.join(list, " and ")) .toString() ); } }
ãã¹ãŠãéåžžã«ç°¡åã§ãã ã²ããšå£ã²ãã«é¢ããæ
å ±ã1è¡ã«æžãããããserializeïŒïŒã¡ãœããã®çµæã¯ãç®çã®è¡ãå«ã
JsonPrimitive
ãªããžã§ã¯ãã«ãªããŸãã
ããšãã°ãgnomeã«ã²ããå£ã²ãããªãå Žåãgnomeå±ã«å¯Ÿããæ
床ãçãããšãã§ããŸãã
if (!src.isHaveBeard() && !src.isHaveMustache()) return new JsonPrimitive("is he really a dwarf?");
ãã以å€ã®å Žåãããªãç°¡åãªã¢ã«ãŽãªãºã ã䜿çšããŠããœãŒã¹ããŒã¿ããå¿
èŠãªåã®æååãååŸããããã«åºã¥ããŠ
JsonPrimitive
ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã ãããŠããã¡ãããå
¥åãªããžã§ã¯ããšé«ªã®è²ã¯ãèšäºã®æè²ç®çã«ãšã£ãŠãŸã£ããéèŠã§ã¯ãªããã§ãã¯ã§ã³ãŒããè€éã«ããªãããã«ãåžžã«åæåããããšèããŠã¿ãŸãããã
ããŒã èªèº«
次ã«ãgnomeã®åŠçå
šäœãå®è£
ããŸãïŒãã§ãã¯ãçç¥ããŸãïŒã
public class DwarfSerializer implements JsonSerializer<Dwarf> { @Override public JsonElement serialize(Dwarf src, Type typeOfSrc, JsonSerializationContext context) { JsonObject result = new JsonObject(); result.addProperty("name", src.getName()); result.addProperty("age", src.getDwarfAge()); result.add("facialHair", context.serialize(src.getFacialHair())); JsonArray weapons = new JsonArray(); result.add("weapons", weapons); for(Weapon weapon : src.getWeapons()) { weapons.add( weapon instanceof UniqueWeapon ? context.serialize(weapon) : new JsonPrimitive(weapon.getType()) ); } return result; } }
ãã®ã³ãŒããéšåçã«è§£æããŸãããã çµæãšããŠJSONãªããžã§ã¯ããååŸããå¿
èŠããããããé©åãªã¿ã€ãã®å€æ°ãäœæããŸãã
JsonObject result = new JsonObject();
次ã«ã
addPropertyïŒïŒã¡ãœããã䜿çšããŠãããªããã£ãåã®ããŒã¿ããªããžã§ã¯ãã«
å
¥åããŸãïŒäžéã®
JsonPrimitive
ãªããžã§ã¯ããäœæããã«ïŒã ã¡ãœããã«2ã€ã®ãã©ã¡ãŒã¿ãŒãæž¡ããŸãã1ã€ç®ã¯ããŒãã€ãŸãJSONãªããžã§ã¯ãã®ããããã£ã®ååã2ã€ç®ã¯å®éã«ã¯ãã®ããããã£ã®å€ã§ãã ããã§ã¯ããdwarfAgeãã®ä»£ããã«ãageãããããã£ã®ååãèšå®ããçµæããã©ã³ãæ
å ±ãé€å€ããŸã-çµæãªããžã§ã¯ãã«è¿œå ããŸããã
result.addProperty("name", src.getName()); result.addProperty("age", src.getDwarfAge());
次ã«ãã²ãã«é¢ããããŒã¿ãè¿œå ããå¿
èŠããããŸãã ãããè¡ãã«ã¯ãã³ã³ããã¹ã
serialize()
ã¡ãœããã䜿çšããŸããåè¿°ã®ããã«ãã³ã³ããã¹ãã¯ç»é²æžã¿ã®
FacialHair
ããã
FacialHair
ã¯ã©ã¹ã«ã¯
FacialHairSerializer
FacialHair
é©çšãããŸãã ç®çã®ããããã£åãæå®ããŠã
addïŒïŒã¡ãœããã䜿çšããŠãçµæã®
JsonElement
ããªããžã§ã¯ãã«
è¿œå ããŸãã
result.add("facialHair", context.serialize(src.getFacialHair()));
ããŒã ã®æŠåšã«é¢ããæ
å ±ãè¿œå ããããšã ããæ®ã£ãŠããŸãã æŠåšã®ã·ã³ããªãã¯ããŒããªãããã
JsonArray
ã€ã³ã¹ã¿ã³ã¹ãäœæããŠããããä¿åããåãaddïŒïŒã¡ãœããã䜿çšããŠãªããžã§ã¯ãã«è¿œå ããŸãã
JsonArray weapons = new JsonArray(); result.add("weapons", weapons);
次ã«ãäœæããé
åã«èŠçŽ ãå
¥åããå¿
èŠããããŸãã
JsonArray
ã¯ã©ã¹ã«ã¯
addïŒïŒã¡ãœããããããŸããã
JsonElement
åã®ãã©ã¡ãŒã¿ãŒã¯1ã€ã ãã§ãè«ççã§ãããã®å ŽåãããŒã¯å¿
èŠãããŸããã åŸæ¥ã®æŠåšãè¿œå ããå Žåãæååã«åºã¥ããŠ
JsonPrimitive
ãäœæããã³ã³ããã¹ãã䜿çšããŠäžæã®æŠåšãã·ãªã¢ã«åããŸãã ãã®å Žåã
UniqueWeapon
ã¯ã©ã¹ã®ãã³ãã©ãŒãç»é²ããªãã£ããããæšæºã®ã·ãªã¢ã«åã¡ã«ããºã ãæ©èœããŸãã
weapons.add( weapon instanceof UniqueWeapon ? context.serialize(weapon) : new JsonPrimitive(weapon.getType()) );
çµæ
æåŸã«ãæå³ããç®çã®ããã«åŽåã®ææã䜿çšããŸãã
DwarvesBand band = BandUtil.createBand(); Gson gson = new GsonBuilder() .setPrettyPrinting() .registerTypeAdapter(Dwarf.class, new DwarfSerializer()) .registerTypeAdapter(FacialHair.class, new FacialHairSerializer()) .create(); String json = gson.toJson(band);
ååŸãããã®ã確èªããŸãã
åºåJSON { "dwarves": [ { "name": "Orin", "age": 90, "facialHair": "black beard and mustache", "weapons": [ { "name": "Slasher", "origin": "Gondolin", "type": "sword" }, { "name": "Oaken Shield", "origin": "Moria", "type": "shield" }, "dagger" ] }, { "name": "Kori", "age": 60, "facialHair": "red mustache", "weapons": [ "mace", "bow" ] }, { "name": "Billy Bob", "age": 45, "facialHair": "is he really a dwarf?", "weapons": [] } ] }
æåŸã®ã¿ãã
å€æŽãããã®ã¯ãææããŠãããã¹ãŠã®ããŒã ãããã¯ãŒããããããã£ã«æ ŒçŽãããŠããé
åã®èŠçŽ ã§ãããšããããšã ãã§ãã ããã¯ã©ããããããå
å®ã§åé·ã§ããããŒã ã«ã€ããŠè©±ããŠããããšã¯ããã£ãŠããŸãããã ågnomeãJSONãªããžã§ã¯ãã®åå¥ã®ããããã£ãšããŸããããŒã¯gnomeã®ååã§ãã äŸïŒ
{ "Kori": { "age": 60, "facialHair": "red mustache", "weapons": [ ... ] }, ... }
ã»ãšãã©ã®å Žåãããªãèªèº«ããã®æçµçãªã¿ããã«åœãå¹ã蟌ãããã«äœãããå¿
èŠããããæ³åã§ããŸãã ãã ãã念ã®ããïŒ
å®è£
1. gnomeäŒç€Ÿå
šäœã«ã·ãªã¢ã©ã€ã¶ãŒãè¿œå ããŸãã
public class DwarvesBandSerializer implements JsonSerializer<DwarvesBand> { @Override public JsonElement serialize(DwarvesBand src, Type typeOfSrc, JsonSerializationContext context) { JsonObject result = new JsonObject(); for(Dwarf dwarf : src.getDwarves()) { result.add(dwarf.getName(), context.serialize(dwarf)); } return result; } }
2.次ã®è¡ãåé€ããŠãgnome
DwarfSerializer
ïŒ
DwarfSerializer
ã¯ã©ã¹ïŒããååæ
å ±ãåé€ããŸãã
result.addProperty("name", src.getName());
3.
GsonBuilder
ã¯ã©ã¹ã®
registerTypeAdapter()
ã¡ãœãããžã®åŒã³åºããè¿œå ããŠãåé
GsonBuilder
registerTypeAdapter()
ãŸãã
.registerTypeAdapter(DwarvesBand.class, new DwarvesBandSerializer())
ãããŠãããŒã ã®äŒç€Ÿã«å¿
èŠãªããŒã¿åœ¢åŒãååŸããŸããã
ãããïŒ { "Orin": { "age": 90, "facialHair": "black beard and mustache", "weapons": [ { "name": "Slasher", "origin": "Gondolin", "type": "sword" }, { "name": "Oaken Shield", "origin": "Moria", "type": "shield" }, "dagger" ] }, "Kori": { "age": 60, "facialHair": "red mustache", "weapons": [ "mace", "bow" ] }, "Billy Bob": { "age": 45, "facialHair": "is he really a dwarf?", "weapons": [] } }
éãé§ãçœãé§ã®ããã«å®å
šã«è¡ãããšãã§ããŸãïŒ
æ»ã
JSONã®åéºããæ»ã£ãgnomeããŒã ã¯ãèªç¶ã«å±
å¿å°ã®è¯ãJavaãªããžã§ã¯ãã«å€èº«ããããšæã£ãŠããŸãã éå€æãã€ãŸãéã·ãªã¢ã«åã®ããã«ãGsonã«ã¯
fromJson()
ã¡ãœããããããŸãã 2ã€ã®ãã©ã¡ãŒã¿ãŒãåããŸããããã€ãã®åœ¢åŒã®ããŒã¿ïŒäœ¿çšãã
String
ãå«ãïŒãšè¿ãããçµæã®åã§ãã ãã ãã以äžã«ç€ºãããã«ãåã«Gsonãªããžã§ã¯ããäœæããŠãã®ã¡ââãœãããåŒã³åºããšã
DwarvesBand
ã®ç©ºã®ãªã¹ããæã€
DwarvesBand
ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãååŸãããŸãã
DwarvesBand dwarvesBand = new Gson().fromJson(json, DwarvesBand.class);
å€æã«ã¯ç¬èªã®ã¢ã«ãŽãªãºã ã䜿çšããããã©ã«ãã®Gsonã¯ãã©ãŒãããã®åŠçæ¹æ³ãç¥ããªããããããã¯èªç¶ãªããšã§ãã ãããã£ãŠããŸã£ããåãæ¹æ³ã§ãç¹æ®ãªãã·ãªã¢ã©ã€ã¶ãŒãäœæããã©ã€ãã©ãªãŒã«ããŒã ã«é¢ããæ
å ±ãåŠçããããã«äœ¿çšããå¿
èŠãããããšãäŒããå¿
èŠããããŸãã ãã§ã«æšæž¬ãããããããŸããããããããäœæããã«ã¯ã
JsonDeserializer <T>ã€ã³ã¿ãŒãã§ãŒã¹ãšãã®å¯äžã®
deserialize ïŒïŒã¡ãœãããå®è£
ããå¿
èŠããããŸãã
T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
䜿çšå¯èœãªãã©ã¡ãŒã¿ãŒïŒ
JsonElement json
ããŒã¿ã®åŸ©å
å
ã®JsonèŠçŽ ãType typeOfT
çµæãšãªããªããžã§ã¯ãã®ã¿ã€ããJsonDeserializationContext context
-éã·ãªã¢ã«åã³ã³ããã¹ãã JsonSerializationContext
ãšåæ§ã«ã JsonDeserializationContext
ã€ã³ã¿ãŒãã§ãŒã¹ã«ã¯1ã€ã®JsonDeserializationContext
deserialize()
ã¡ãœãããå«ãŸããŠããŸãã ãã®ã³ã³ããã¹ãã¯ãgsonãªããžã§ã¯ãã®ãã¹ãŠã®èšå®ãç¶æ¿ããŸã
è¿ãããããŒã¿åã¯ãã©ã¡ãŒã¿ãŒåãããŸãã
ããå§ããŸãããïŒ
ããããŒãïŒ
å°ããå§ããŸãããã ããã²ããšå£ã²ãã«é¢ããããŒã¿ã埩å
ããŸãã å®å
šãªãã·ãªã¢ã©ã€ã¶ãŒã³ãŒãïŒ
public class FacialHairDeserializer implements JsonDeserializer<FacialHair> { @Override public FacialHair deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { FacialHair hair = new FacialHair(); String data = json.getAsString(); List<String> parts = Arrays.asList(data.split(" ")); if(parts.contains("beard")) hair.setHaveBeard(true); if(parts.contains("mustache")) hair.setHaveMustache(true); if(hair.isHaveBeard() || hair.isHaveMustache()) hair.setColor(parts.get(0)); return hair; } }
ã¯ããè¯ãæ¹æ³ã§ãå
¥åããŒã¿ããã泚ææ·±ããã§ãã¯ãã䟡å€ããããŸãããäŸã®ã³ãŒããè€éã«ããªãããã«ãããæ£ããããšã¯åœç¶ã ãšæããŸãã
ãã®ã¡ãœããã®æãéèŠãªè¡ïŒ
String data = json.getAsString();
getAsStringïŒïŒã¡ãœããã¯ãæå¹ãªæååãå«ã
JsonPrimitive
åã®èŠçŽ ããŸãã¯
JsonArray
åã®ãã®ãããªèŠçŽ ã1ã€ã ãå«ã
JsonPrimitive
é©çšãããå Žåã
JsonElement
ã®å
容ãæååã«å€æããŸãã ããã§ãªãå Žåãã¡ãœããã¯äŸå€ãã¹ããŒããŸãã ãã©ãŒã
getAs{JavaType}()
ãã¹ãŠã®ã¡ãœããã¯åæ§ã«æ©èœããŸãã
å
¥åãšããŠæååã
JsonPrimitive
ãååŸããã®ã§ãããããã§ãã¯ããŸããïŒ
isJsonPrimitive()
ã¡ãœããã䜿çšã§ããŸãïŒã ååŸããããŒã¿ãããã«åŠçããã®ã¯ç°¡åã§ãããç§ãã¡ã¯ãã®ããŒã¿ã«ãšã©ãŸããŸããã
ããŒã
ããŒã ã®ããŒã¿ã埩å
ããæãæ¥ãŸããã ãã®ããã«ããŸãïŒ
public class DwafDeserializer implements JsonDeserializer<Dwarf> { @Override public Dwarf deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { JsonObject jsonObject = json.getAsJsonObject(); Dwarf dwarf = new Dwarf(); dwarf.setDwarfAge(jsonObject.get("age").getAsInt()); dwarf.setFacialHair((FacialHair) context.deserialize(jsonObject.get("facialHair"), FacialHair.class)); JsonArray weapons = jsonObject.getAsJsonArray("weapons"); for(JsonElement weapon : weapons) { if(weapon.isJsonPrimitive()) { dwarf.addWeapon(new Weapon(weapon.getAsString())); } else { dwarf.addWeapon((UniqueWeapon) context.deserialize(weapon, UniqueWeapon.class)); } } return dwarf; } }
ç¹°ãè¿ããŸãããç°¡æœã«ããããã«äžéšã®ãã§ãã¯ã¯çç¥ãããŠããŸãã éšåçã«åæããŸãã
gnomeã«é¢ããæ
å ±ã¯
JsonObject
ãšããŠè¡šãããããšã
JsonObject
ãŠãããããå
¥åããã§ãã¯ããã«ãã®ã¿ã€ãã«å€æããŸãã
JsonObject jsonObject = json.getAsJsonObject();
幎霢ã¯æŽæ°åã§ãããããæåã«
get()
ã¡ãœããã
JsonElement
幎霢ã
JsonElement
ã¡ãœããã¯ãæå®ããããageãããããã£ã®å€ãæã€
JsonElement
ãè¿ãã次ã«
getAsInt()
ã¡ãœããã
getAsInt()
ãŸãã
dwarf.setDwarfAge(jsonObject.get("age").getAsInt());
context.deserialize()
ã䜿çšããŠãã²ãããŒã¿ã
FacialHair
ã¿ã€ãã®ãªããžã§ã¯ãã«åŸ©å
ããŸãã èŠããŠããããã«ãã³ã³ããã¹ãã¯ã²ãæ
å ±ãåŠçããããã«ç¹å¥ãªãã·ãªã¢ã©ã€ã¶ãŒã䜿çšããå¿
èŠãããããšãèªèããŠããŸãã
dwarf.setFacialHair((FacialHair) context.deserialize(jsonObject.get("facialHair"), FacialHair.class));
Jsoné
åã®åœ¢åŒã§ãæŠåšãããããã£ã®å€ãããã«ååŸããŸãã æåã«getïŒãæŠåšãïŒã¡ãœããã§
JsonElement
ãååŸãã次ã«
isJsonArray()
ã¡ãœããã䜿çšããŠé
åã®åã確èªãã次ã«
isJsonArray()
ã¡ãœããã䜿çšããŠé
åã«å€æããŸãã ããããç§ãã¡ã¯ããŒã ãšãã®å
¥åã®åœ¢åŒãä¿¡ããŠããŸãã
JsonArray weapons = jsonObject.getAsJsonArray("weapons");
æŠåšã®ããŒã¿ã埩å
ããããã«ãé
åããŠã©ãŒã¯ã¹ã«ãŒããŸãã
for(JsonElement weapon : weapons) { if(weapon.isJsonPrimitive()) { dwarf.addWeapon(new Weapon(weapon.getAsString())); } else { dwarf.addWeapon((UniqueWeapon) context.deserialize(weapon, UniqueWeapon.class)); } }
åèŠçŽ ã«ã€ããŠã
JsonPrimitive
ã¿ã€ããã©ããã確èªããŸãã åŸæ¥ã®æŠåšã¯ããã®ã¿ã€ãã«å¯Ÿå¿ããåçŽãªç·ã§èšè¿°ãããŠããããšãèŠããŠããŸãã ãã®å ŽåãåŸæ¥ã®æŠåšã®ã€ã³ã¹ã¿ã³ã¹ãäœæãã
getAsString()
ã¡ãœããã䜿çšããŠãã®ã¿ã€ããååŸããŸãã ããã§ãªããã°ãç§ãã¡ã¯ãŠããŒã¯ãªæŠåšãæ±ã£ãŠããŸãã æšæºã®Gsonã¡ã«ããºã ã䜿çšããã³ã³ããã¹ãã䜿çšããŠåŠçããŸããã
context.deserialize()
ã䜿çšããŠãåãããšãå®è¡ããŸãã
äœãã足ããªãããšã«æ°ã¥ããïŒ ãããŠããäœããã ãã§ãªããããŒã ã®ååãïŒ ãã®éèŠãªè©³çŽ°ãè¿œå ããŠgnomeæ
å ±ã®å埩ãå®äºããã«ã¯ãæåŸã®ãã·ãªã¢ã©ã€ã¶ãŒã«é²ã¿ãŸãããã
ãã¿ããã¡ã³ã
æåŸã«ãgnomeããŒã å
šäœã®ãã³ãã©ãŒãè¿œå ããŸãã
public class DwarvesBandDeserializer implements JsonDeserializer<DwarvesBand> { @Override public DwarvesBand deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { DwarvesBand result = new DwarvesBand(); JsonObject jsonObject = json.getAsJsonObject(); for(Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) { Dwarf dwarf = context.deserialize(entry.getValue(), Dwarf.class); dwarf.setName(entry.getKey()); result.addDwarf(dwarf); } return result; } }
gnomeåŠçãšåæ§ã«
JsonObject
å
¥åã
JsonObject
åã«
JsonObject
ãŸãã
JsonObject
ã¯
Map<String, JsonElement>
ãšããŠè§£éã§ããããšã¯åã«è¿°ã¹ãã®ã
JsonObject
ãŸããïŒ
Map
ãšåæ§ã«ã
JsonObject
ã¯ãå€ãã®ããŒãšå€ã®èŠçŽ ãè¿ã
entrySet()
ã¡ãœããããããŸãã 圌ã®å©ããåããŠãããŒã ã«é¢ãããã¹ãŠã®èšé²ãäžå·¡ããŸãã
èŠçŽ ã®å€ã¯ãååãé€ããgnomeã«é¢ãããã¹ãŠã®æ
å ±ã§ãã ã³ã³ããã¹ãã䜿çšããŠãã®æ
å ±ãéã·ãªã¢ã«åããDwarfã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãååŸããŸãã
Dwarf dwarf = context.deserialize(entry.getValue(), Dwarf.class);
空çœã®ãŸãŸã«ãªã£ãŠããååã¯ãèŠçŽ ããŒã«å«ãŸããŠããŸãã ããããªããžã§ã¯ãã«æžã蟌ããšãã§ããã°gnomeã«é¢ããæ
å ±ãå®å
šã«åŸ©å
ãããŸãïŒ
dwarf.setName(entry.getKey());
ããŒã ã¹ã€ãŒãããŒã
çŒãããŠã®ãã·ãªã¢ã©ã€ã¶ãŒãç»é²ããããšã¯æ®ã£ãŠããããThere and Backãã®æ
ãå§ããããšãã§ããŸãã ç»é²ã¯ãã·ãªã¢ã©ã€ã¶ãŒã®ç»é²ãšãŸã£ããåãã§ãã
Gson gson = new GsonBuilder() .registerTypeAdapter(DwarvesBand.class, new DwarvesBandDeserializer()) .registerTypeAdapter(FacialHair.class, new FacialHairDeserializer()) .registerTypeAdapter(Dwarf.class, new DwafDeserializer()) .create();
ãã¹ãããã«ã¯ãæåã«ããŒã ã®äŒç€ŸãJsonæååã«å€æãã次ã«å
ã«æ»ããæ確ã«ããããã«ãæšæºã®Gsonã¡ã«ããºã ã䜿çšããŠååŸããJsonãªããžã§ã¯ããšããŠçµæãåºåããŸãã ããªãã¯èª°ãå¿ãããããäœãå¿ããããªãããšã確èªããããšãã§ããŸãããã¹ãŠã®ããŒã ã¯å®å
šã§å¥å
šã«æ»ããŸããïŒ
æ€èšŒã³ãŒã DwarvesBand company = BandUtil.createBand(); Gson gson; gson = new GsonBuilder() .registerTypeAdapter(Dwarf.class, new DwarfSerializer()) .registerTypeAdapter(FacialHair.class, new FacialHairSerializer()) .registerTypeAdapter(DwarvesBand.class, new DwarvesBandSerializer()) .create(); String json = gson.toJson(company); gson = new GsonBuilder() .registerTypeAdapter(DwarvesBand.class, new DwarvesBandDeserializer()) .registerTypeAdapter(FacialHair.class, new FacialHairDeserializer()) .registerTypeAdapter(Dwarf.class, new DwafDeserializer()) .create(); DwarvesBand bandIsBack = gson.fromJson(json, DwarvesBand.class); gson = new GsonBuilder() .setPrettyPrinting() .create(); System.out.println(gson.toJson(bandIsBack));
çµæ { "dwarves": [ { "name": "Orin", "facialHair": { "haveBeard": true, "haveMustache": true, "color": "black" }, "weapons": [ { "name": "Slasher", "origin": "Gondolin", "type": "sword" }, { "name": "Oaken Shield", "origin": "Moria", "type": "shield" }, { "type": "dagger" } ], "dwarfAge": 90 }, { "name": "Kori", "facialHair": { "haveBeard": false, "haveMustache": true, "color": "red" }, "weapons": [ { "type": "mace" }, { "type": "bow" } ], "dwarfAge": 60 }, { "name": "Billy Bob", "facialHair": { "haveBeard": false, "haveMustache": false, "color": "" }, "weapons": [], "dwarfAge": 45 } ] }
äž¡æ¹åã«
ãã®ããããThereãïŒJavaããJSONãžïŒãšãBackãïŒJSONããJavaãžïŒã®æ
ã調ã¹ãŸããã
JsonElement
ãšã
JsonElement
ã
JsonElement
芪åã«æäŸããŠããã
JsonElement
ãããªãªããžã§ã¯ãã®äžéå±€ã§äœæ¥ããŸããã
ãŸããéåžžã«äŸ¿å©ã§ããããªãŒããŒãããã«ã€ãªãããŸãã Gsonã¯ãäžéå±€ãåé€ããããšã§ããã©ãŒãã³ã¹ã®å©äŸ¿æ§ãç ç²ã«ããæ©äŒãäžããŠãããŸãããããè¡ãã«ã¯ãã«ã¹ã¿ã å€æã«JsonSerializer + JsonDeserializerã®ãã¢ã§ã¯ãªããäž¡æ¹åã«å€æããããã«èšèšãããTypeAdapter <T>ã¯ã©ã¹ã®å®è£
ã䜿çšããŸããç§ãã¡ãæãèå³ãæã£ãŠããã®ã¯ããã®ã¯ã©ã¹ã®2ã€ã®æœè±¡ã¡ãœãã- write()
ãšread()
ã§ãããããã¯ãã«ã¹ã¿ã å€æã«è²¬ä»»ããããŸãã-ã·ãªã¢ã«write()
åãããã³read()
-ã·ãªã¢ã«å解é€ã
ããã©ã«ãã§ãgnomeã®æŠåšãç¬èªã®ããã€ã¹ã«æããããšãèŠããŠããŸããïŒãã®äžæ£ãä¿®æ£ããŸãããã ããŽã³ãã©ã®æ¬æå
µãã®ãããªè¡ã«æŠåšã®ååãšèµ·æºãçµã¿åãããŸãããããŠãããããªããšãããªãããã«ãç§ãã¡ã¯äœæããŸãTypeAdapter
ãŠããŒã¯ãªã¢ã€ãã ã ãã§ãªããæŠåšã®ãªã¹ãå
šäœã«å¯ŸããŠãã¯ã©ã¹ã¯æ¬¡ã®ããã«ãªããŸãã public class WeaponsTypeAdapter extends TypeAdapter<List<Weapon>> { @Override public void write(JsonWriter out, List<Weapon> value) throws IOException {
ããŠãå€ãã¹ããŒã ã«ããã°ãã¡ãœãããåŒã³åºãããšã«ãããæŠåšãªã¹ãã®æ°ãããã³ãã©ãŒãGsonã«éç¥ããå¿
èŠããã.registerTypeAdapter()
ãŸãããã ããé害ããããŸãã-ã¡ãœããã®æåã®ãã©ã¡ãŒã¿ã¯ãç§ãã¡ãéåžžã®ãªã¹ãã販売ãããã³ãã©ãç»é²ãããŠããããŒã¿åã§ãGNOMEã®æŠåšList<Weapon>
ããŸããä»ã®ãã¹ãŠã®ãªã¹ããTypeAdapterã«ãã£ãŠåŠçãããããšã¯æãŸãããããŸããããã©ã¡ãŒã¿åãããåãæž¡ããŠãæŠåšã®ãªã¹ãå°çšã§ããããšãäœããã®åœ¢ã§ç€ºãå¿
èŠããããŸãããããè¡ãããã«ãGsonã¯ç¹å¥ãªããªãããŒãªã¯ã©ã¹-TypeToken <T>ã䜿çšããŸããããã«ããã次ã®ããã«å¿
èŠãªãã©ã¡ãŒã¿ãŒåãããåãååŸã§ããŸãã Type weaponsListType = new TypeToken<List<Weapon>>(){}.getType();
å®éãTypeToken
å¿åã¯ã©ã¹ã«ãã£ãŠãã©ã¡ãŒã¿ãŒåãããã¯ã©ã¹ãç¹å¥ã«ç¶æ¿ããŠããããgetGenericSuperclass()
ãã¡ãœããã®èŠªããã©ã¡ãŒã¿ãŒåããåãååŸã§ããŸãããã®å Žåã芪ããã©ã¡ãŒã¿ãŒåããåã¯ours List<Weapon>
ã§ããå°ã
æ··ä¹±ããŸãããå¥ã®æ¹æ³ã§ãæ®å¿µãªããäœããããŸãããããšãã°ããã®èšäºã§ã¯ãæ±çšã¯ã©ã¹ã®ãã©ã¡ãŒã¿ãŒã®ååŸã«ã€ããŠè©³ããèªãããšãã§ããŸãããããããã«-éåžžã©ããïŒ Type weaponsListType = new TypeToken<List<Weapon>>(){}.getType(); Gson gson = new GsonBuilder() .setPrettyPrinting() .registerTypeAdapter(Dwarf.class, new DwarfSerializerWithTypeAdapter()) .registerTypeAdapter(FacialHair.class, new FacialHairSerializer()) .registerTypeAdapter(DwarvesBand.class, new DwarvesBandSerializer()) .registerTypeAdapter(weaponsListType, new WeaponsTypeAdapter()) .create();
gnomeã®ã·ãªã¢ã«åãšã·ãªã¢ã«å解é€ã®ã³ãŒããå€æŽããã ãã§ãåŠçãããå€ã®ã¿ã€ãã瀺ãã³ã³ããã¹ãã«æŠåšã®åŠçã®å¶åŸ¡ãæž¡ããŸãã public class DwarfSerializerWithTypeAdapter implements JsonSerializer<Dwarf> { public JsonElement serialize(...) { ... Type weaponsType = new TypeToken<List<Weapon>>(){}.getType(); result.add("weapons", context.serialize(src.getWeapons(), weaponsType)); ... } } public class DwafDeserializerWithTypeAdapter implements JsonDeserializer<Dwarf> { public Dwarf deserialize(...) { ... Type weaponsType = new TypeToken<List<Weapon>>(){}.getType(); List<Weapon> weapons = context.deserialize(jsonObject.getAsJsonArray("weapons"), weaponsType); dwarf.addWeapons(weapons); ... } }
以äžã§ãã¢ããã¿ãŒã¯æ¥ç¶ãããŸãããããããããå®çŸããããã«æ®ã£ãŠããŸãããã€ãã®ããã«ããã¿ãã¬ã®äžã«ã¯å®å
šãªã³ãŒãããããŸããããã«ã€ããŠã¯ã以äžã§è©³çŽ°ã«åæããŸããå®å
šãªTypeAdapterã³ãŒã public class WeaponsTypeAdapter extends TypeAdapter<List<Weapon>> { @Override public void write(JsonWriter out, List<Weapon> value) throws IOException { out.beginArray(); for (Weapon weapon : value) { if (weapon instanceof UniqueWeapon) { UniqueWeapon uWeapon = (UniqueWeapon) weapon; out.beginObject(); out.name("name") .value(uWeapon.getName() + " from " + uWeapon.getOrigin()); out.name("type") .value(uWeapon.getType()); out.endObject(); } else { out.value(weapon.getType()); } } out.endArray(); } @Override public List<Weapon> read(JsonReader in) throws IOException { List<Weapon> result = new LinkedList<>(); in.beginArray(); while (in.hasNext()) { switch (in.peek()) { case STRING: result.add(createCommonWeapon(in)); break; case BEGIN_OBJECT: result.add(createUniqueWeapon(in)); break; default: in.skipValue(); break; } } return result; } private Weapon createCommonWeapon(JsonReader in) throws IOException { return new Weapon(in.nextString()); } private Weapon createUniqueWeapon(JsonReader in) throws IOException { UniqueWeapon weapon = new UniqueWeapon(); in.beginObject(); while (in.hasNext()) { switch (in.nextName()) { case "name": String[] tmp = in.nextString().split(" from "); weapon.setName(tmp[0]); if (tmp.length > 1) weapon.setOrigin(tmp[1]); break; case "type": weapon.setType(in.nextString()); break; default: in.skipValue(); break; } } in.endObject(); return weapon; } }
ãããŠåã³
ãã®ãããã¡ãœããã¯ããã§å€æãè¡ããŸãwrite()
ã圌ã®ã³ãŒãã¯ïŒ public void write(JsonWriter out, List<Weapon> value) throws IOException { out.beginArray(); for (Weapon weapon : value) { if (weapon instanceof UniqueWeapon) { UniqueWeapon uWeapon = (UniqueWeapon) weapon; out.beginObject(); out.name("name") .value(uWeapon.getName() + " from " + uWeapon.getOrigin()); out.name("type") .value(uWeapon.getType()); out.endObject(); } else { out.value(weapon.getType()); } } out.endArray(); }
ã¡ãœããã®ãã©ã¡ãŒã¿ãŒã«ã¯ãJsonWriterã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãšæŠåšã®ãªã¹ãããããŸããJsonWriter
ã¹ããªãŒãã³ã°ã¢ãŒãã§åºåJSONãäœæã§ããŸãããŸããæŠåšããŒã¿ãä¿åããé
åãå¿
èŠã§ãã out.beginArray(); ... out.endArray();
å®éããããã®ã³ãã³ãã¯ãè§æ¬åŒ§ãé
眮ãã圹å²ãæãããŸãïŒå®éãJSONã®é
åãæå®ãããŠããããïŒãåºåã§é
åãååŸãããã®ã§ãã¡ãœããã®æåã§éå§ããæåŸã§çµäºããŸããããã§ã¯ãã¹ãŠãéåžžã«ç°¡åã§ããåæ§ã«ãã¡ãœãã<codebeginObjectïŒïŒ</ codeããã³<codeendObjectïŒïŒ</ codeã䜿çšããŠãªããžã§ã¯ããäœæããŸããããã«ãåŸæ¥ã®æŠåšã®å Žåãã¡ãœãããåŒã³åºãããšã«ãããåçŽã«ããªããã£ãåïŒæååïŒã®å€ãé
åã«æžã蟌ã¿ãŸãvalue()
ã out.value(weapon.getType());
ãããŠããŠããŒã¯ãªæŠåšã®å Žåããªããžã§ã¯ããäœæãã2ã€ã®ããŒãšå€ã®ãã¢ãæžã蟌ã¿ã亀äºã«name()
ãšã¡ãœãããåŒã³åºããŸãvalue()
ã out.name("name") .value(uWeapon.getName() + " from " + uWeapon.getOrigin()); out.name("type") .value(uWeapon.getType());
ããã ãã§ããæŠåšã®é
åãèšé²ãããŸãããããŠåã³
æŠåšãæ··åããŒã¿åã®JSONé
åã«ããªãåšå¢ããå€æããŸãããïŒãããŠä»ããããå
ã«æ»ãæã§ãããããŠãããã§å°ããªåé¡ãåŸ
ã£ãŠããŸãããã®ãããã¡ãœããread()
ã¯1ã€ã®ãã©ã¡ãŒã¿ãŒãåããŸãã public List<Weapon> read(JsonReader in) throws IOException {...}
JsonReaderã¯ã©ã¹ã¯ãJsonããããŒã¿ãæœåºããã»ããã¹ããªãŒã 圢åŒã§ã䜿çšããŸãããããã£ãŠããã¹ãŠã®ãããŒãããäžè²«ããŠãœãŒãããããã«å¿ããŠåŠçããå¿
èŠããããŸããèšé²ãšåæ§ã«ããªããžã§ã¯ããšé
åã¯beginObject() / endObject()
ããã³ã¡ãœããã«ãã£ãŠåŠçãããŸãbeginArray() / endArray()
ããªããžã§ã¯ãã®ããããã£ã¯ãã¡ãœããnextName()
ãå€-ã¡ãœããnext{Type}()
ïŒããšãã°ãnextString()
ïŒã§ãœãŒãããŸããé
åèŠçŽ ãã¡ãœããã«ãã£ãŠç¹°ãè¿ããnext{Type}()
ãŸãããã ããç¹å®ã®èŠçŽ ã®ã·ãŒã±ã³ã¹ã䜿çšããå³å¯ãªããŒã¿åœ¢åŒã䜿çšããŠããå Žåãããã¯ãã¹ãŠè¯å¥œã§ãããããŠããã€é
åãéããããã€ãªããžã§ã¯ããéãããªã©ãããããŸãããã®ã±ãŒã¹ã§ã¯ãJsonãªããžã§ã¯ããšæååãä»»æã®é åºã§é
眮ã§ããé
åã®æ··åããŒã¿åãæ±ã£ãŠããŸãã幞ããªããšã«GsonReader
ãŸãpeek()
ã次ã®ããŒãã®ã¿ã€ããåŠçããã«è¿ãã¡ãœããããããŸãããããã£ãŠãã¡ãœããã®äžè¬çãªãã¥ãŒã¯æ¬¡ã®read()
ããã«ãªããŸãã @Override public List<Weapon> read(JsonReader in) throws IOException { List<Weapon> result = new LinkedList<>(); in.beginArray(); while (in.hasNext()) { switch (in.peek()) { case STRING: result.add(createCommonWeapon(in)); break; case BEGIN_OBJECT: result.add(createUniqueWeapon(in)); break; default: in.skipValue(); break; } } in.endArray(); return result; }
gnomeã®å
µåšåº«ã¯ããªããžã§ã¯ãïŒäžæã®ã€ã³ã¹ã¿ã³ã¹ã®å ŽåïŒãšæååïŒéåžžã®ã€ã³ã¹ã¿ã³ã¹ã®å ŽåïŒãå«ãé
åã§è¡šãããããšãããã£ãŠããŸãããããã£ãŠãé
åã®åèŠçŽ ãåŠçããŠããã®èŠçŽ ã®åæããŒãã®ã¿ã€ãã確èªããŸããæååãšãªããžã§ã¯ããåŠçããããã«ãåŒã³åºãã¡ãœãããäœæããŸãããä»ã®ã¿ã€ãã¯ã¡ãœããã«ãã£ãŠåã«ã¹ãããããskipValue()
ãŸããåŸæ¥ã®æŠåšãäœæããæ¹æ³ã¯éåžžã«ç°¡åã§ãã private Weapon createCommonWeapon(JsonReader in) throws IOException { return new Weapon(in.nextString()); }
ã¡ãœããnextString()
ã䜿çšããŠæŠåšã®ã¿ã€ããå«ãè¡ãååŸããããã«åºã¥ããŠãªããžã§ã¯ããäœæããŸãããŠããŒã¯ãªæŠåšã§-ããå°ãè€éïŒ private Weapon createUniqueWeapon(JsonReader in) throws IOException { UniqueWeapon weapon = new UniqueWeapon(); in.beginObject(); while (in.hasNext()) { switch (in.nextName()) { case "name": String[] tmp = in.nextString().split(" from "); weapon.setName(tmp[0]); if (tmp.length > 1) weapon.setOrigin(tmp[1]); break; case "type": weapon.setType(in.nextString()); break; default: in.skipValue(); break; } } in.endObject(); return weapon; }
ãªããžã§ã¯ãã«å
¥ããã¡ãœããã䜿çšããŠãã®ãã¹ãŠã®ããããã£ãå埩åŠçããŸãnextName()
ããnameãããã³ãtypeããšããååã®ããããã£ã«ã¯ãåŠçã¢ã«ãŽãªãºã ããããŸã-ãããã«åºã¥ããŠãåŸæ¥ã®ãŠããŒã¯ãªæŠåšã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸããæ®ãã®ããããã£ïŒããå ŽåïŒããã¹ããããããŸãããããã£ãŠãTypeAdapterã䜿çšããgnomeã®å
µåšã®ã·ãªã¢ã«å解é€ã®æºåãã§ããŸããã念ã®ããããã¹ãŠãæ£åžžãã©ããã確èªããŸããæ€èšŒã³ãŒã DwarvesBand company = BandUtil.createBand(); Gson gson; Type weaponsType = new TypeToken<List<Weapon>>(){}.getType(); gson = new GsonBuilder() .registerTypeAdapter(Dwarf.class, new DwarfSerializerWithTypeAdapter()) .registerTypeAdapter(FacialHair.class, new FacialHairSerializer()) .registerTypeAdapter(DwarvesBand.class, new DwarvesBandSerializer()) .registerTypeAdapter(weaponsType, new WeaponsTypeAdapter()) .setPrettyPrinting() .create(); String json = gson.toJson(company); System.out.println("Serialized:"); System.out.println(json); gson = new GsonBuilder() .registerTypeAdapter(DwarvesBand.class, new DwarvesBandDeserializer()) .registerTypeAdapter(FacialHair.class, new FacialHairDeserializer()) .registerTypeAdapter(Dwarf.class, new DwafDeserializerWithTypeAdapter()) .registerTypeAdapter(weaponsType, new WeaponsTypeAdapter()) .create(); DwarvesBand companyIsBack = gson.fromJson(json, DwarvesBand.class); gson = new GsonBuilder() .setPrettyPrinting() .create(); System.out.println("\n\nDeserialized:"); System.out.println(gson.toJson(companyIsBack));
çµæ Serialized: { "Orin": { "age": 90, "facialHair": "black beard and mustache", "weapons": [ { "name": "Slasher from Gondolin", "type": "sword" }, { "name": "Oaken Shield from Moria", "type": "shield" }, "dagger" ] }, "Kori": { "age": 60, "facialHair": "red mustache", "weapons": [ "mace", "bow" ] }, "Billy Bob": { "age": 45, "facialHair": "is he really a dwarf?", "weapons": [] } } Deserialized: { "dwarves": [ { "name": "Orin", "facialHair": { "haveBeard": true, "haveMustache": true, "color": "black" }, "weapons": [ { "name": "Slasher", "origin": "Gondolin", "type": "sword" }, { "name": "Oaken Shield", "origin": "Moria", "type": "shield" }, { "type": "dagger" } ], "dwarfAge": 90 }, { "name": "Kori", "facialHair": { "haveBeard": false, "haveMustache": true, "color": "red" }, "weapons": [ { "type": "mace" }, { "type": "bow" } ], "dwarfAge": 60 }, { "name": "Billy Bob", "facialHair": { "haveBeard": false, "haveMustache": false, "color": "" }, "weapons": [], "dwarfAge": 45 } ] }
ããšãã
ãããã£ãŠãJavaããJSONãžããããŠãã®éãžã®æ
ã¯çµãããŸãããããã«ã€ããŠã¯ãèªè
ã®çãããç§ã®äŒæãåãããŠãã ãããããªããèå³ãæã£ãŠããããšãé¡ã£ãŠããŸãã圹ã«ç«ã€ãããããªãããã€ãã®ãªã³ã¯ãæãåºãããŠãã ããïŒãããŠåœŒãã¯ãã®åŸã幞ãã«æ®ãããŸãããçµããã