ããã«ãäžéšã®ã¢ããªã±ãŒã·ã§ã³ã§JSONãããŸã奜ãã§ã¯ãªãçç±ãšãç§ã®æèŠã§ã¯ãJSONãå°ã䟿å©ã«ããããã«ã©ã®ããã«å€æŽã§ããã®ãã説æããŸãã
ç§ã¯ããã«ãKTVãJSONã®ä»£æ¿ãšããŠèããŠããªãããšã«æ³šæããå¿ èŠããããŸãã ãããŠã決ããŠJavaScriptã§ã®äœ¿çšãæ€èšããŸããã äžäŸ¿ã§ééã£ãŠããŸãã äžæ¹ãJavaScriptãªããžã§ã¯ãèšè¿°ã·ã¹ãã ãä»ã®èšèªã§åä»ãããŒã¿ãåŠçããããã«äœ¿çšãããç¶æ³ãå¥åŠã§ãããä¿®æ£ããããšæããŸãã
ãã®åœ¢åŒãäœæããæåã®çç±ã«èå³ãããå Žåã¯ã S2ãšKTV圢åŒãäœæããçç±ã«ã€ããŠèªãããšãã§ããŸãã
JSONã®é·æãšçæ
JSONèªäœã¯åªããŠããŸãã
- ã·ã³ãã«ã ã³ã¡ã³ãããªãããšãæè¬ããŸãã ããããæ®ã£ãŠãããšãã¡ã¿æ å ±ãããã«ããã·ã¥ããå§ãïŒJSONã¯éåžžã«è²§åŒ±ãªããïŒãè¡šèšæ³ã¯ããã«ãŽãã«å€ãããŸãã
- è¡šçŸåè±ãã XMLãšã¯ç°ãªããŸãããå¹ åºãã¿ã¹ã¯ã«ååã§ãã
- ã¬ã³ãŒããããXMLãããå€§å¹ ã«çãã
JSONã®ç æ°ã¯ç©èªããçãŸããŸãã JavaScriptã®
eval(-)
ããæäœã«äŸ¿å©ãªãªããžã§ã¯ããçæããå¿ èŠããããŸããã æ®å¿µãªãããä»ã®èšèªã®evalã¯éåžžãåäœãç°ãªãïŒååšããå ŽåïŒãèšèªèªäœãç°ãªããŸãã ãã®åœ¢åŒãéJavaScriptã§äœ¿çšãããšããã®æ¬ é¥ãèŠããŸãã
- åŒçšç¬Šã æšæºïŒæšæºãšããŠã http ïŒ //www.json.orgããããã¹ããåããŸã ïŒã«åŸã£ãŠããã¹ãŠã®ååãåŒçšç¬Šã§å²ãå¿ èŠããããŸãã ããšãã°ããããã¯ãŒã¯çµç±ã§ããŒã¿ãéä¿¡ããããã«JSONã䜿çšããå Žåãããã¯éå°ã§ãã
- ã¿ã€ãã³ã°ã®æ¬ åŠã ããæ£ç¢ºã«ã¯ãåã¯ãããŸãããæååå šäœ/æ°å€/ true / false / nullã§ãã ãããŠãé åãæã€ãªããžã§ã¯ãã ããã ãã§ã æ¥ä»ãæŽæ°ãå°æ°ããããŸããã ã¢ãã«ãç解ããããããããã«ããªããžã§ã¯ããåã§ããŒã¯ããæ¹æ³ã¯ãããŸããã
- ãªããžã§ã¯ããèšé²ããããã®æšæºã®æ¬ åŠã ããã«ãããããšãã°ãå éšã«ãªããžã§ã¯ããæ··åšããé åãäœæãããå ŽåããããŸãã ããã解æããå¿ èŠããããšã-ããã¯çãã§ãã
- ãªã³ã¯ã®æ¬ åŠã JSONã§ãªããžã§ã¯ãã®éå±€æ§é ãèšè¿°ããå Žåãç°ãªãå Žæããåããªããžã§ã¯ããžã®ãªã³ã¯ãå®æçã«ãããŸãã JSONã¯ãæåã®äœ¿çšãåç §ããããšãäžå¯èœã«ããŸãã äœããçºæãããããªããžã§ã¯ãå šäœãç¹°ãè¿ãå¿ èŠããããŸãããããã¯æ§é ã®ãµã€ãºãšè§£æã®è€éãã«ãšã£ãŠæªãããšã§ãã
JSONã®ããã«æ©èœãã圢åŒãèŠã€ããããšãè©Šã¿ãŸããïŒçæ³çã«ã¯ããã®ã¹ãŒããŒã»ããã«ãªããŸãïŒããåæã«äžèšã®åé¡ã®äžéšãŸãã¯ãã¹ãŠãæšæºçãªæ¹æ³ã§è§£æ±ºããããšãã§ããŸããã YAMLãèŠã€ãããŸããã
ã€ã ã«
Yamlã¯è¯ãã§ãã ããã¯ã»ãšãã©JSONã®ã¹ãŒããŒã»ããã§ãããæ確ã«å®çŸ©ããïŒ http://www.yaml.org/spec/1.2/spec.html ïŒãèªã¿ãããã§ãã ãããåæã«ïŒ
- æ§é ã®ãã¹ãã¯ã€ã³ãã³ãã«ãã£ãŠæ±ºå®ãããŸãã æ å ±ãéä¿¡ããå Žåãããããåé€ã§ãããšäŸ¿å©ã§ãã ã¿ãæ奜家ãå°éããããã€ã³ãã³ãã¯ã¹ããŒã¹ã«ãããŸããã
- YAMLã¯éåžžã«è€éã§ãã å€æ°ã®ç¹æ®æåãæ§é äžã®åæã«ãããYAMLã®ãµããŒããè€éã«ãªããããŒãµãŒãå°é£ã«ãªããŸãïŒYAML 1.2ã¯7幎åã«ç»å ŽããŸãããããµã€ãã®ãã¥ãŒã¹ã«ãããšãããŒãµãŒã¯äŸç¶ãšããŠäž»ã«ä»¥åã®ããŒãžã§ã³ããµããŒãããŠããŸãïŒã
äžè¬çã«ãYAMLã¯ãè¡ããŸããã§ãããã 圌以å€ã«ãç§ã¯äžè¬çãªãã©ãŒããããç¥ããŸããã çªç¶ããªããç¥ã£ãŠããå Žå-æžã蟌ã¿ãç§ã¯åãã§èŠãŸãã
ããã¯ç§ãåŸããã®ãæ瀺ããæéã§ãã
KTV
Key-Type-Valueã ãã®åœ¢åŒãåŒã³åºããŸãã
JSONã§åçŽãªãªããžã§ã¯ããæžããŸãããã
{ "name": "Alex", "coolness": 3.1415, "isAProgrammer": true }
KTVã§ãããæžãæãããšã次ã®ããã«ãªããŸãã
{ name: Alex coolness: 3.1415 isAProgrammer: true }
äœãå€ãã£ãŠããªãããã§ãã ãããã詳ããèŠãŠã¿ãŸãããïŒ
- åŒçšç¬Šã¯åé€ãããŸããã çŸåšãããŒãŸãã¯å€ã«éèŠãªæååãããå Žåã«ã®ã¿å¿ èŠã§ãã éåžžã®ç¶æ³ã§ã¯ãåŒçšç¬Šã¯å¿ èŠãããŸããã
- è¡æ«ã®ã«ã³ãã¯åé€ãããŸãã 1è¡ã«è€æ°ã®å®çŸ©ãèšè¿°ããå ŽåããããïŒãŸãã¯ã»ãã³ãã³ïŒãèšå®ã§ããŸãã ããããåŸæ¥ã®èšé²ã§ã¯ããããã¯çç¥ã§ããŸãã
æåãš2çªç®ã®äŸã¯ã©ã¡ããæå¹ãªKTVãã¡ã€ã«ã§ãã ããã¯éåžžã«éèŠã§ãããªããªããæšæºã®JSONãKTVããŒãµãŒã«æ¿å ¥ã§ãã圌ã¯åãã§ãããé£ã¹ãããã§ãã ãŸããããšãã°ãã¢ã¡ããã£ãå©çšã§ããŸãã
ã¿ã€ãã¯ã©ãã«ãããŸããïŒ äžèšã®å Žåãã¿ã€ãã¯å€ããæšæž¬ãããŸãã ãAlexãã¯æååãªãã©ã«ã§ãããããååã®ã¿ã€ãã¯ãstringããã¯ãŒã«ãã¹ã¯ãdoubleããisAProgrammer-ãboolãã§ãã ãããã®ã¿ã€ãã«å ããŠããnullãïŒå¥åãnilããååãžã®æšæ¶ïŒããintãããcolorãããããŸãã åãäŸãäœæããŸãããåãå®å šã«æå®ããŸãã
{ name(string): Alex coolness(double): 3.1415 isAProgrammer(bool): true }
ãã¹ãããããªããžã§ã¯ã/é åã¯ãŸã ããã«ãããŸãã è¿œå ããïŒ
- ãªããžã§ã¯ããšé åã®äž¡æ¹ãåãæã€ããšãã§ããŸãã é åã®å Žåãã¿ã€ãã¯é åå ã®åãªããžã§ã¯ãã®å ±éã¿ã€ãã§ãã 2ã€ã®ç°ãªãã¿ã€ãïŒæåå/æ°å€ããŸãã¯ç°ãªããªããžã§ã¯ãïŒãé åã«å ¥ããããšã¯ã§ããŸããã
- é
åãŸãã¯ãªããžã§ã¯ãã®ã¿ã€ãã¯ã解ææã«ãã®ãªããžã§ã¯ããŸãã¯é
åããã£ã¹ãããå¿
èŠãããã¯ã©ã¹ã瀺ãå ŽåããããŸãã äŸïŒ
property(font): {name:..., size:...}
ãã©ã³ããªããžã§ã¯ãã瀺ãããšãã§ãããããŠ
property(point): [2, 3]
èªèæã«ãã€ã³ããªããžã§ã¯ãã«å€æã§ããŸãã ååãšããŠããã€ã³ãããªããžã§ã¯ãã«ããããšãã§ããŸãïŒå°éå ·xãyã䜿çšïŒãããªãã§ããïŒ ã©ãã«ãããã¯ãã§ã«ããã£ãŠããŸãã
ãªã³ã¯ãä»ã®ããããã£ãåç §ããæ©èœããããŸãã ãã®ãããªãã®ïŒ
{ property: value another: @property }
ããã«ãããããã€ãã®åå²ãªããžã§ã¯ãã®èšé²ãççž®ããããåã«å®æ°ãèšå®ããŠããã¡ã€ã«ã®ä»ã®éšåã§ããããåç §ãããã§ããŸãã æåã®æ©èœã¯ããªããžã§ã¯ãã®æ§é ãéèŠã§ãªãå Žåã«RESTã§åœ¹ç«ã¡ãŸãã 2çªç®ã¯æ§æãã¡ã€ã«ã«ãããŸãã
ããã¯ã¹ã€ã³ã®ã¢ã€ãã¢ã¯ãä»ã®èšèªãããåçšãããŠããŸãã ãããã䜿çšãããšã1ã€ã®ãªããžã§ã¯ããå¥ã®ãªããžã§ã¯ãã«ã¢ã¿ããã§ããŸãã ããã¯ç¶æ¿ãšèããããšãã§ããŸãããç¶æ¿ã¯OOPããã®ãã®ã§ãããåäœã¯ç¶æ¿ãããããããã£ã®ã¿ããããŸãã ã ãããæ··ããã»ããããã
{ object: { a: ..., b: ...} object2(+object): { c: ..., d: ... } }
ãã®äŸã§ã¯ã解æåŸã®object2ã«ã¯ãç¬èªã®ããããã£ãšãªããžã§ã¯ãããã®ããããã£ã®äž¡æ¹ãå«ãŸããŸãã ã€ãŸããaãbãcãããã³dã§ãã
ã³ã¡ã³ã
ã³ã¡ã³ãã«æµæã§ãããæŽçã§ããŸããã§ããã //ãŸãã¯ïŒã§èšå®ã§ããŸãã ã©ã¡ãã®ã¿ã€ãã®ã³ã¡ã³ããã€ã³ã©ã€ã³ã§ããããããã¯ã³ã¡ã³ãã¯ãããŸããã
2çªç®ã®ã¿ã€ãïŒå «è§åœ¢ïŒã«ã¯ããããªåé¡ããããŸãã å®éã®ãšãããè²ãªãã©ã«ã¯ãæšæºã®CSSãã©ãŒã ãã€ãŸã#rrggbbaaã§èšå®ããããšã«ãªã£ãŠããŸããããã¯ãã³ã¡ã³ããèšè¿°ããããã®çŸåšã®ãªãã·ã§ã³ãšç«¶åããŸãã ãããã£ãŠããããããå°æ¥çã«ã¯Cãªãã·ã§ã³ïŒ//ïŒã®ã¿ãååšããã§ãããã
ãã©ãŒãããäœæ¥
ãã®åœ¢åŒã¯ç§ã®ããã§ããããã®åœ¢åŒã®ããŒãµãŒã¯2ã€ã®å Žæã§å¿ èŠã§ãã
- S2ã«ã¹ã¿ã€ã«æ å ±ãä¿åããïŒ Ã ngströmã¹ã¿ã€ã«ã·ã¹ãã ã®éçºïŒ
- ãã®ãããSwiftäžã®ç¬èªã®ãµãŒããŒãšãã®äžã®ã¢ããªã±ãŒã·ã§ã³éã®éä¿¡ãæ¹åã§ããŸãã
ãããã£ãŠãSwiftå°çšã®åœ¢åŒã䜿çšããããšãæ€èšããŸãã ååãšããŠã圢åŒã¯éåžžã«ã·ã³ãã«ã§ãã©ã®èšèªã§ãããŒãµãŒãæŽçããã®ã¯é£ãããããŸããã
Swiftã®åé¡ã«ãããKTVãã/ KTVãžã®ãªããžã§ã¯ãã®æ¬åœã«æ£ããããŒã/ã·ãªã¢ã«åãã§ããªããªããŸããã ãããã£ãŠããã®åœ¢åŒã䜿çšããããã»ã¹ã¯æ¬¡ã®ãšããã§ãã
- ã¢ãã«ã¯ã©ã¹ãäœæãããŸãã éåžžã®ã¯ã©ã¹ïŒæ³šéä»ãã®
@objc
ãå«ãïŒãŸãã¯æ§é äœãšåæ§ã åã¯ã©ã¹ã¯KTVGenerated
ãããã³ã«ãå®è£ ããå¿ èŠããããŸãã - ãžã§ãã¬ãŒã¿ã䜿çšããŠããªããžã§ã¯ããããŒãããã³ã·ãªã¢ã«åã§ãããããã®ã¯ã©ã¹ã®æ¡åŒµæ©èœãäœæãããŸãã
- çæããããã®ã䜿çšããŠãKTVããªããžã§ã¯ãã«ããŸãã¯ãã®éã«ïŒãŸãã¯JSONãã/ã«ïŒå€æããŸãã
ã¢ãã«æ§é ã¯ãããšãã°æ¬¡ã®ããã«ãªããŸãã
public struct RootObject: KTVGenerated { var string:String // var stringOrNil:String? // optional var int:Int // var stringArray:[String] // var stringDictionary:[String:Int] // var object:ChildObject? // private var _privateString:String // private(set) var _privateSetString:String // â let _constantString:String // }
ãã¹ãŠã®äž»èŠãªæ©èœããµããŒããããŠããããšãããããŸãã
- ã¿ã€ãïŒãžã§ãã¬ãŒã¿ãŒãã¯ã©ã¹æ¡åŒµãæ£ããäœæã§ããããã«ãæ瀺çã«ç»é²ããå¿ èŠããããŸãã
- ã³ã¬ã¯ã·ã§ã³ïŒé åããã³é£æ³é åïŒã
- ãªããžã§ã¯ãéå±€ïŒä»ã®ã¢ãã«ã¯ã©ã¹ãžã®ãªã³ã¯ïŒ
- ã·ãªã¢ã«åã«é¢äžããªãããããã£ïŒãããã¯å®æ°ããã©ã€ããŒãããããã£ãããã³ãã©ã€ããŒãã»ãã¿ãŒãæã€ããããã£ã§ãïŒ
ãã®ãããªããŒãµãŒã®äœæã®æŽå²ã¯ãå¥ã®èšäºã®ãããã¯ã§ãã æ§é ãšã¯ã©ã¹ãåæã«ç¶æããã¿ã¹ã¯ãå±æ§èªäœãªãã§å±æ§ãèšå®ããæ¹æ³ããã¡ã€ã«åæã«ãªãã¬ã¯ã·ã§ã³ã®ä»£ããã«SourceKitã䜿çšããæ¹æ³ãã«ã¹ã¿ã ããããŒã®å¿ èŠæ§ïŒéæšæºã®æ¥ä»ã®è§£æãªã©ïŒã ããŒãµãŒèªäœã¯çŸåšãç©æ¥µçãªéçºã®ããã»ã¹ã«ããã絶ããå€åããŠããŸãã ããããååãªé¢å¿ãããå Žå-ç§ã¯ã¯ãŒãã³ã°ãã©ãããã¬ã€ã¢ãŠããããªãã·ã§ã³ã«ã€ããŠè°è«ããŸãã
å¥ã®ããŒã¿åœ¢åŒã®å©ç¹
https://xkcd.com/927/
JSONã¯ãã¢ããªã±ãŒã·ã§ã³éã§ããŒã¿ã転éããããã®ãããã圢åŒã§ãã ããã¯ãJavaScriptã§ãªããžã§ã¯ããèšè¿°ããããã®åœ¢åŒã§ãã ãããŠãç§ãã¡ã¯åžžã«å®å šã«ç°ãªãç®çã§ããã䜿çšãããªã³ãšãªãã®äž¡æ¹ã§æŒãåºããŸãã
å®è¡äžã®ã¿ã¹ã¯ã«ããé©åãããã®ã«ç§»ãæãæ¥ãããã«æããŸãã å³å¯ãªã¿ã€ãã³ã°ãåããæ°ããSwiftããµãŒããŒããã¢ãã€ã«ã¯ã©ã€ã¢ã³ãã«é »ç¹ã«è»¢éããå¿ èŠã®ããè€éãªããŒã¿æ§é ã IDEã§ãã³ã³ãã€ã«äžããã³è§£æäžã«æ§æããã§ãã¯ã§ãã圢åŒãå¿ èŠã§ãã ãããŠãKTVã¯ãåºæ¬çã«æ§é ãå€æŽããããšãªããå®è³ªçã«æ¢ã«ç¥ãããŠãã圢åŒãè€éã«ããããšãªããããã€ãã®äŸ¿å©ãªå°ããªãã®ãè¿œå ããããã«æããŸãã
å®éšçãªãœãŒã¹ã³ãŒããç°¡åãªèª¬æã§æçš¿ããŸãã Swiftã§ãã©ãŒããããæ§æ解æããããã®ããŒãµãŒãããèå³æ·±ãããªãã¯ããããŸãã ããããçªç¶èª°ããèŠãããšæãã§ãããïŒ http : //github.com/bealex/KTV
ãããããç§ã¯å€ãã®ããšãéããããèæ ®ããŸããã§ããã ãã¶ã誰ããåæ§ã®çµéšãæã£ãŠããŸããïŒ ã³ã¡ã³ãããŸãã¯ã¡ãŒã«ïŒalex@jdnevnik.comã«æžããŠãã ããã