æè¿ã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ãžããããŠãã®éãžã®æ
ã¯çµãããŸãããããã«ã€ããŠã¯ãèªè
ã®çãããç§ã®äŒæãåãããŠãã ãããããªããèå³ãæã£ãŠããããšãé¡ã£ãŠããŸãã圹ã«ç«ã€ãããããªãããã€ãã®ãªã³ã¯ãæãåºãããŠãã ããïŒãããŠåœŒãã¯ãã®åŸã幞ãã«æ®ãããŸãããçµããã