äžæžã
Jacsonã¯JSON(JavaScript Object Notation)ãšåŒã°ããããŒã¿èšè¿°èšèªãæ±ãããã®Javaã©ã€ãã©ãªã
ãŠã§ãã¢ããªã±ãŒã·ã§ã³éçºã§ã¯JSONãå¿ é ã®æè¡ã«ãªã£ãŠããŠããã Javaã§JSONãæ±ãããã®APIãJava EE 7ã«å«ãŸããäºå®ãJSR 343ãšããŠä»æ§çå®äžã
JSONã¯JavaScriptã®ãªãã©ã«è¡šèšãããŒã¹ã«ããããŒã¿èšè¿°èšèªã ã¯ã©ã€ã¢ã³ãã®ãŠã§ããã©ãŠã¶ãªã©ã§å©çšã§ããJavaScriptã§å®¹æã«æ±ãããããWebãµãŒããšã®ããŒã¿äº€æãã©ãŒããããšããŠåºãå©çšãããŠããã
RFC 4627ã§ä»æ§ãèŠå®ãããŠããã ãŸãjson.orgã§ãJSONã®ä»æ§ã確èªããããšãã§ããã json.orgã«ã¯æ¥æ¬èªã®ããŒãžãçšæãããŠããã®ã§è±èªãèŠæãªæ¹ã¯ãã¡ããåç §ã
JSONã«ã¯6ã€ã®ããŒã¿åãããã
- ãªããžã§ã¯ã
- é å
- æåå
- æ°å€
- çåœå€
- nullå€
ãªããžã§ã¯ãã¯ååãšå€ã®ãã¢ãéããããŒã¿æ§é ã
{ãš}ã®éã«ååãšå€ã®ãã¢ãã«ã³ãåºåãã§è¡šèšããã
ååãšå€ã®ãã¢ã¯:ã§åºåã£ãŠè¡šèšããã
ååã«ã¯æååã®è¡šèšã䜿ãã
å€ã«ã¯ä»»æã®JSONã®ããŒã¿ãèšè¿°ã§ããã
ã¹ã«ã©ãŒå€ã ãã§ãªããããŒã¿æ§é ãèšè¿°ã§ããã®ã§ããªããžã§ã¯ããé
åããã¹ãããè€éãªããŒã¿ã衚çŸããããšãã§ããã
{} // 空ãªããžã§ã¯ã
{"val":null} // nullãå€ã«æã€
{"val1":false, "val2":true} // çåœå€ãå€ã«æã€
{"val1":123, "val2":12.3, "val3":12E3} // æ°å€ãå€ã«æã€
{"val1":null, "val2":false, "val3":123} // å€ã®åãäžæ§ã§ãªããŠããã
// å€ã«é
åããªããžã§ã¯ããæã€ããšãã§ãã
{
"extensions": ["java", "js"],
"java":{"name":"Java", "typing":"static"},
"js":{"name":"JavaScript", "typing":"dynamic"}
}
{"":"empty"} // ååã®éšåã¯ç©ºæååã§ããã{val:"wrong name"} // ååãäºéåŒçšç¬Šã§å²ãŸããŠããªã
{'val':"wrong name"} // ååãååŒçšç¬Šã§å²ãŸããŠãã
{123:"wrong name"} // ååãæååã§ãªã
{"val1":"Java", "val2":"JavaScript",} // äœèšãªã«ã³ã
{"val1":"Java", , "val2":"JavaScript"} // é£ç¶ãã2ã€ã®ã«ã³ãååãšå€ã®ãã¢ã®è¡šèšé åºã¯éåžžã¯æå³ãæããªãã ååãšå€ã®ãã¢ã®è¡šèšé åºãç°ãªããªããžã§ã¯ãã§ãã£ãŠããåãååãšå€ã®ãã¢ã®ã»ããã衚èšãããŠãããªãããããã¯æå³çã«åãå€ãæã€ãªããžã§ã¯ãã§ããã
é åã¯é åºä»ãã§å€ãéããããŒã¿æ§é ã
[ãš]ã®éã«èŠçŽ ãšãªãå€ãã«ã³ãåºåãã§è¡šèšããã
èŠçŽ ã«ã¯ä»»æã®JSONã®ããŒã¿ãèšè¿°ã§ããã
ã¹ã«ã©ãŒå€ã ãã§ãªãã(以äžãªããžã§ã¯ããšåã)
é
åã®è¡šèšäŸ
空é
å
å€ã«ã¹ã«ã©ãŒ
èŠçŽ ã®ããŒã¿åãäžæ§ã§ãªã
ãã¹ãããè€éãªããŒã¿æ§é
誀ã£ãé
åã®è¡šèšäŸ
äœèšãªã«ã³ã
æåŸã®èŠçŽ ã®åŸãã«äœèšãªã«ã³ãããã
èŠçŽ ã®éã«äœèšãªã«ã³ãããã(2ã€ä»¥äžã®ã«ã³ãããã)
é åã®èŠçŽ ã¯éåžžã¯é åºãæã€ããŒã¿æ§é ãšããŠè¡šçŸãããã 衚èšãããŠããèŠçŽ ã®é åºããã®ãŸãŸé åã®ããŒã¿æ§é ã§ã®é åºãšãªãã
æååã¯æåã®äžŠã³ãäºéåŒçšç¬Š"ã§å²ãã§è¡šèšããã
äºéåŒçšç¬Šãããã¯ã¹ã©ãã·ã¥ãå¶åŸ¡æå(U+0000ãã`U+001F)ãæååã®äžã«å«ããã«ã¯ãšã¹ã±ãŒãããå¿
èŠãããã
ãšã¹ã±ãŒãã®è¡šè𿹿³ã¯2çš®é¡ããã
äžã€ã¯ãã䜿ãæåãããã¯ã¹ã©ãã·ã¥ãšç¹å®ã®ASCIIæåã®2æåã§è¡šèšããæ¹æ³ã ãã®æ¹æ³ã§è¡šèšã§ãããšã¹ã±ãŒãã¯æ¬¡ã®éãã
\": äºéåŒçšç¬Š(",U+0022)\\: ããã¯ã¹ã©ãã·ã¥(\,U+005C)\/: ã¹ã©ãã·ã¥(/,U+002F)\b: ããã¯ã¹ããŒã¹(U+0008)\f: ãã©ãŒã ãã£ãŒã(U+000C)\n: æ¹è¡ãã©ã€ã³ãã£ãŒã(U+000A)\r: 埩垰ããã£ãªããžãªã¿ãŒã³(U+000D)\t: æ°Žå¹³ã¿ã(U+0009)
ããäžã€ã¯ãŠãã³ãŒãã®ã³ãŒããã€ã³ãã衚èšããæ¹æ³ã
ãšã¹ã±ãŒãå¯Ÿè±¡ã®æåãåºæ¬å€èšèªé¢(BMP, U+0000ããU+FFFF)ã®ç¯å²ã§ãããªããããã¯ã¹ã©ãã·ã¥\ãšuã«ç¶ããŠ4æ¡ã®16鲿°ã§ã³ãŒããã€ã³ãã衚èšããããšã§ãšã¹ã±ãŒãããã
åºæ¬å€èšèªé¢ã®ç¯å²å€ã®æ¡åŒµæåã¯UTF-16ã®ãµãã²ãŒããã¢ãçµã¿åãããŠè¡šçŸããã
æååã®è¡šèšäŸ
空æåå
ASCIIã®ç¯å²ã®æåå
ASCIIç¯å²å€ã®æåå
ãšã¹ã±ãŒãã®äŸ
2æåãšã¹ã±ãŒã
ã³ãŒããã€ã³ãã®ãšã¹ã±ãŒã
ãµãã²ãŒããã¢
誀ã£ãæååã®è¡šèšäŸ
ååŒçšç¬Šã§å²ã
æ°å€ã¯ç¬Šå·éšãæŽæ°éšãå°æ°éšãææ°éšããã®é åºã§çµã¿åãããŠè¡šèšããã
笊å·éšãã€ãã¹èšå·-ã§è¡šèšããããã©ã¹ç¬Šå·+ã䜿ãããšã¯ã§ãããæ£ã®å€ã®å Žåã«ã¯ç¬Šå·éšãçç¥ããã
æŽæ°éšã¯10鲿°ã®æ°åã®åãæŽæ°éšã®å€ã0ã§ããå Žåãé€ããŠã0ã§å§ãŸã衚èšã¯ã§ããªãã æŽæ°éšã¯çç¥ã§ããªãã
å°æ°éšã10鲿°ã®æ°åã®åãå°æ°éšã¯äœèšãª0ãåŸãã«ãã£ãŠããããæŽæ°éšãšå°æ°éšã¯å°æ°ç¹.ã§åºåãã
å°æ°éšã¯çç¥ã§ããã
ææ°éšã¯ç¬Šå·ãš10鲿°ã®æ°å€ã®åã§è¡šèšããã
ææ°éšã®ç¬Šå·ã«ã¯-笊å·ã ãã§ãªã+笊å·ã䜿ãããææ°éšã®10鲿°ã®æ°å€ã®åã¯äœèšãª0ã§å§ãŸã£ãŠããŠãããã
æŽæ°éšãå°æ°éšãšãææ°éšã¯eãEã®ã©ã¡ããåºåããææ°éšã¯çç¥ã§ããã
æ°å€ã®è¡šèšäŸ
ãŒã
æŽæ°
ãã€ãã¹
å°æ°
ææ°
å°æ°ãšææ°ã®çµã¿åãã
誀ã£ãæ°å€ã®è¡šèšäŸ
+笊å·ãã€ãã
æŽæ°éšãçç¥
çåœå€ã¯trueãfalseãšè¡šèšããããã¹ãŠå°æåã§ãªããã°ãªããªãã
çåœå€ã®è¡šèšäŸ
true
false
誀ã£ã衚èšäŸ
倧æå
nullå€ã¯æå³ã®ããå€ããªãããšã瀺ããnullå€ã¯nullãšè¡šèšããããã¹ãŠå°æåã§ãªããã°ãªããªãã
nullå€ã®è¡šèšäŸ
null
誀ã£ã衚èšäŸ
倧æå
JSONã¯JavaScriptã®ãµãã»ãããšããŠå®çŸ©ãããŠããã®ã§ãJavaScriptã®ãªãã©ã«è¡šèšãç¥ã£ãŠããã°JSONãèšè¿°ããã®ã«å°ãããšã¯å°ãªãããšã¯ããJSONãšJavaScriptã®ãªãã©ã«è¡šèšã«ã¯ããããç°ãªãç¹ããããJSONãšJavaScriptã®éãã§åŒã£ããããããç¹ãæããŠèª¬æããã
undefinedNaNInfinity
(ããã¯JSONãšJavaScriptãšã®éãã§ã¯ãªããã)
eval('(' + jsonText + ')'ãšãã£ãã³ãŒãã§JSONãããŒã¹ããããšãã§ãããã®ã®ãããã¯ã»ãã¥ãªãã£äžã®åé¡ãããã®ã§é¿ããã¹ãã
ãã®æ¹æ³ã§ããŒã¹ãããšãJavaScriptã®ã³ãŒããšããŠè©äŸ¡ãããã®ã§ãä»»æã®JavaScriptã®ã³ãŒããå®è¡ããŠããŸãè匱æ§ãšãªãå¯èœæ§ãããã
æè¿ã®ãã©ãŠã¶ã§ããã°ãJSON.parse()ã¡ãœãããšJSON.stringify()ã¡ãœããã远å ãããŠãããããã䜿ã£ãŠå®å šã«JSONãæ±ãããšãã§ãããå€ããã©ãŠã¶ã§ã¯ããããã®ã¡ãœããã¯ãµããŒããããŠããªãããjson2.jsã䜿ãããšã§ãå€ããã©ãŠã¶ã§ããããã®ã¡ãœããã䜿ããããã«ãªãã
<script src="json2.js"></script>
<script type="text/javascript">
var jsonText = '["key1":"val1", "key2":"val2", "key3":"val3"]';
var obj = JSON.parse(jsonText);
var data = obj.key1;
</script>Jacksonã«ã¯æ¬¡ã®ãããªã¢ãžã¥ãŒã«ãããã
- Core: ã¹ããªãŒãã³ã°API(JSONããŒãµãJSONãžã§ãã¬ãŒã¿)ã®ã€ã³ã¿ãŒãã§ãŒã¹ãšå®è£ ãªã©
- Mapper(Optional): ããŒã¿ãã€ã³ãã£ã³ã°æ©èœãªã©
- ããªãŒã¢ãã«ã®ããã®
TreeMapperãJsonNode#TreeMapperãªããŠãã£ãã£ãïŒ - JSONããJavaãªããžã§ã¯ããçæããããJavaãªããžã§ã¯ããJSONãšããŠæžãã ãããããããã®
ObjectMapper
- ããªãŒã¢ãã«ã®ããã®
- JAX-RS(Optional): Jerseyãªã©ã®JAX-RSå®è£
ã§Jacksonããæè»œã«äœ¿ããã
- JAX-RSã¢ãžã¥ãŒã«ã䜿ãã«ã¯Mapperã¢ãžã¥ãŒã«ãå¿ èŠ(Mapperã¢ãžã¥ãŒã«ãããã«Coreã¢ãžã¥ãŒã«ãå¿ èŠãšãã)ã
- XC(Xml Compatibility)(Optional): Jacksonã®ã¢ãããŒã·ã§ã³ã®ä»£ããã«JAXBã¢ãããŒã·ã§ã³ã䜿ããã
- MrBean(Materialized Bean)(Optional): ã€ã³ã¿ãŒãã§ãŒã¹ãæœè±¡ã¯ã©ã¹ããå®è£
ã¯ã©ã¹ãçæããæ©èœãªã©
- MrBeanã¢ãžã¥ãŒã«ã䜿ãã«ã¯Mapperã¢ãžã¥ãŒã«ãCoreã¢ãžã¥ãŒã«ãå¿ èŠã
- Smile(Optional): SmileãšããJSONãšäºæãªãã€ããªåœ¢åŒã®ãµããŒããªã©
- Smileã¢ãžã¥ãŒã«ã䜿ãã«ã¯Coreã¢ãžã¥ãŒã«ãå¿ èŠã
ãã®ã»ãã«ã次ã®ãããªjarãããã
- jackson-all: Jacksonã®ã¢ãžã¥ãŒã«ããã¹ãŠãå«ãjarãã¢ãžã¥ãŒã«ã«åå²ãããjarãé¢åãªãšãã«äœ¿ãã(䜿ãJacksonã®ããŒãžã§ã³ãäžãããšãã«åå²ãããã¢ãžã¥ãŒã«ã®ããããã®ããŒãžã§ã³ãåãã«æããã®ãé¢åãšãïŒ)ãããã¯ãå¿ èŠãšããç¹å®ã®ã¯ã©ã¹ã ããå«ããç¬èªã®ãµãã»ããã®jarãäœæããããã®å ãšããŠäœ¿ãã
- jackson-mini: Coreã¢ãžã¥ãŒã«ããã©ã€ã»ã³ã¹ãã¡ã€ã«ãã¢ãããŒã·ã§ã³ã¯ã©ã¹ãåãé€ããªã©ããŠãjarã®ãµã€ãºã40%åæžãããã®
jarãããŠã³ããŒãããŠããŠãã¯ã©ã¹ãã¹ã®éã£ãŠãããšããã«ã«jarã眮ãã
pom.xmlã«æ¬¡ã®ãããªèšè¿°ã远å ããã
<repositories>
<repository>
<id>codehaus-snapshots</id>
<url>http://snapshots.repository.codehaus.org</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.5</version>
</dependency>
</dependencies>ãã¥ã¢ã«ã©ã€ã»ã³ã¹ãAL 2.0ãšLGPL 2.1ã
Jacksonã®åŠçã¢ãã«
- ããŒã¿ãã€ã³ãã£ã³ã°
- ãã«ããŒã¿ãã€ã³ãã£ã³ã°
- ã·ã³ãã«ããŒã¿ãã€ã³ãã£ã³ã°
- ããªãŒã¢ãã«
- ã¹ããªãŒãã³ã°API
JSONãšJavaãªããžã§ã¯ããšã®ãã€ã³ãã£ã°ã Jacksonã®åŠçã¢ãã«ã®äžã§æãçŽæçã§äœ¿ããããåŠçã¢ãã«ã§ãããã
ããŒã¿ãã€ã³ãã£ã³ã°æ©èœã䜿ãã«ã¯Mapperã¢ãžã¥ãŒã«(ãšäŸåããCoreã¢ãžã¥ãŒã«)ãå¿ èŠ
Javaãªããžã§ã¯ããJSONããã¹ãã«å€æããããšãããã§ã¯ã·ãªã¢ã©ã€ãºãšåŒã¶ããšã«ããã
ObjectMapperãªããžã§ã¯ãã®writeValue()ã¡ãœãã(ãŸãã¯writeValueAsBytes()ã¡ãœãããwriteValueAsString()ã¡ãœãã)ã䜿ãã
Object obj = ...; // ã·ãªã¢ã©ã€ãºãããªããžã§ã¯ã
OutputStream outputStream = ...; // ã·ãªã¢ã©ã€ãºããJSONãåºåããã¹ããªãŒã
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.writeValue(outputStream, obj);writeValue()ã¡ãœããã®ç¬¬1åŒæ°ã¯JSONããã¹ãã®åºåå
ãæå®ãããwriteValue()ã¡ãœããã¯ç¬¬1åŒæ°ã®åã§ãªãŒããŒããŒããããŠãããJsonGeneratorãFileãOutputStreamãWriterãæå®ã§ããã
writeValue()ã¡ãœããã®ç¬¬2åŒæ°ã«ã¯ã·ãªã¢ã©ã€ãºããJavaãªããžã§ã¯ããæå®ããã
ObjectMapper#writeValue(JsonGenerator jgen, Object value): voidObjectMapper#writeValue(File file, Object value): voidObjectMapper#writeValue(OutputStream out, Object value): voidObjectMapper#writeValue(Writer writer, Object value): void
writeValueAsBytes()ã¡ãœãããšwriteValueAsString()ã¡ãœããã¯ç¬¬1åŒæ°ã«ã·ãªã¢ã©ã€ãºããJavaãªããžã§ã¯ããæå®ããã
writeValueAsBytes()ã¡ãœããã®è¿åŽå€ã¯ã·ãªã¢ã©ã€ãºçµæãUTF-8ãšã³ã³ãŒãã£ã³ã°ããbyteé
åã§ããã
writeValueAsString()ã¡ãœããã®è¿åŽå€ã¯ã·ãªã¢ã©ã€ãºçµæã®æååã§ããã
ObjectMapper#writeValueAsBytes(Object value): byte[]ObjectMapper#writeValueAsString(Object value): String
ã·ãªã¢ã©ã€ãºã¯ãã·ãªã¢ã©ã€ãºå¯Ÿè±¡ã®Javaãªããžã§ã¯ãã®å®éã®åãåºã«ã·ãªã¢ã©ã€ãºçµæã®JSONããã¹ãã«åºåããå å®¹ãæ±ºå®ããã
Mapå®è£ ã¯ã©ã¹ã¯JSONãªããžã§ã¯ãã«ã Javaé åãCollectionå®è£ ã¯ã©ã¹ã¯JSONé åã«ã(ãã ããcharé åãé€ã) charé åãCharSequenceãStringãStringBuilderãStringBufferã¯JSONæååã«ã(ãã ããWRITE_CHAR_ARRAYS_AS_JSON_ARRAYSãæå¹ã ãšJSONé åã«) Javaã®æ°å€åã¯JSONæ°å€ã«ã Javaã®çåœå€ã¯JSONã®çåœå€ã«ã Javaã®nullå€ã¯JSONã®nullå€ã«ã
ãã®ä»ã®POJOã¯JSONãªããžã§ã¯ããšããŠåºåããããã®ããããã£ã¯ã²ãã¿ãŒããã£ãŒã«ããå ã«åºåãããã
MapãCollectionã®ç·ç§°åã®æ±ã åæå æ¥ä»å
enumã¯JSONæååã«ã(ãã ãWRITE_ENUMS_USING_INDEXã ãšJSONæŽæ°ã«)
ã·ãªã¢ã©ã€ãºçµæã®JSONããã¹ãã«åºåããå 容ã¯ãã·ãªã¢ã©ã€ãºå¯Ÿè±¡ã®ãªããžã§ã¯ãã®å®éã®åãå ã«ããŠæ±ºå®ããããããããPOJOãã·ãªã¢ã©ã€ãºãããšããç¹å®ã®ããããã£ã¯ã·ãªã¢ã©ã€ãºå¯Ÿè±¡ããé€å€ãããå Žåãããã
次ã®ãããªã¡ãœããã䜿ã£ãŠç¹å®ã®åãšããŠã·ãªã¢ã©ã€ãºãããã®ãµãã¯ã©ã¹ã§å®£èšãããŠããããããã£ãã·ãªã¢ã©ã€ãºããªãããã«ããã
ObjectMapper#writerWithType(Class<?> rootType): ObjectWriterObjectMapper#writerWithType(JavaType rootType): ObjectWriterObjectMapper#writerWithType(TypeReference<?> rootType): ObjectWriter
ObjectWriterãªããžã§ã¯ãã®withType()ã¡ãœããã䜿ã£ãŠãåæ§ã®ããšãã§ããã
SerializationConfig.Feature.USE_STATIC_TYPINGãæå¹ã«ããããšã§ãPOJOãMapãªã©ã®JSONãªããžã§ã¯ãã«ã·ãªã¢ã©ã€ãºãããJavaãªããžã§ã¯ãã®ããããã£ãJavaé åãCollectionãªã©ã®JSONé åã«ã·ãªã¢ã©ã€ãºãããJavaãªããžã§ã¯ãã®èŠçŽ ãã·ãªã¢ã©ã€ãºãããšããããããã£ãèŠçŽ ã®å®éã®åã§ã¯ãªããããããã£ãšããŠå®£èšãããŠããåãèŠçŽ ãšããŠå®£èšãããŠããåã®ããããã£ã®ã¿ãã·ãªã¢ã©ã€ãºããããšãã§ããã
ããããã£ã®èªåæ€åºãå¶åŸ¡ãããå Žå: @AutoDetect,VisibilityChecker,AUTO_DETECT_GETTERS,AUTO_DETECT_IS_GETTERS,AUTODETECT_FIELDS
ä»»æã®ããããã£ãç¡èŠãããå Žå: @JsonIgnore ããããã£ã®ã°ã«ãŒãåãã§ç¡èŠãããå Žå: View ç¡èŠããããããã£ãåçã«å¶åŸ¡ãããå Žå: Filter
ãã£ãŒã«ãã®å Žåãtransient修食åãã€ããããšã§ãç¡èŠãããããtransient修食åã®æ¬æ¥ã®ç®çã«çæããŠä»ãããã©ãããæ±ºããããã«ã
JSONããã¹ãããJavaãªããžã§ã¯ããçæããããšãããã§ã¯ãã·ãªã¢ã©ã€ãºãšåŒã¶ããšã«ããã
ObjectMapperãªããžã§ã¯ãã®readValue()ã¡ãœããã䜿ãã
InputStream inputStream = ...; // ãã·ãªã¢ã©ã€ãºããJSONããã¹ãã®å
¥åã¹ããªãŒã
ObjectMapper objectMapper = new ObjectMapper();
<<ãã·ãªã¢ã©ã€ãºçµæå>> result = objectMapper.readValue(inputStream, <<ãã·ãªã¢ã©ã€ãºçµæå>>.class);ããã§ããã·ãªã¢ã©ã€ãºå ã®åãšã¯æ¬¡ã®éãã§ããã
ObjectMapper#readValue()ã¡ãœããã®ç¬¬2åŒæ°ã«æž¡ãå- JSONãªããžã§ã¯ãã®ããããã£ããã·ãªã¢ã©ã€ãºããããšãã®ããã·ãªã¢ã©ã€ãºå ã®Javaã®åã®ããããã£ã®å
- JSONé åããã·ãªã¢ã©ã€ãºããããšãã®ããã·ãªã¢ã©ã€ãºå ã®Javaã®åã®èŠçŽ ã®å
JSONã®åã«å¯ŸããŠæå®ã§ããJavaã®åã¯æ¬¡ã®ããã«ãªãã
-
JSONãªããžã§ã¯ã: Map, NavigableMap, SortedMapãšMapå®è£ ã¯ã©ã¹(æœè±¡ã¯ã©ã¹ã¯ãã¡)(å®è£ ã¯ã©ã¹ãæå®ããå Žåã®ã€ã³ã¹ã¿ã³ã¹åã®èŠåã«ã€ããŠã¯èŠèª¿æ»)(Stringé åãæå®ãããšããªããå€ãªèŠåã§ãã·ãªã¢ã©ã€ãºã§ãããããª)
-
JSONé å: Javaé å, Collection, List, Set, SortedSet, Queue, DequeãšCollectionã®å®è£ ã¯ã©ã¹(æœè±¡ã¯ã©ã¹ã¯ãã¡) (charé åã¯ãã¡ã ã£ããããª) (Javaé åã®ãšãã¯ãJSONé åã®èŠçŽ ããJavaé åã®èŠçŽ ã®åã«å€æã§ããå¿ èŠããã)
-
JSONæåå: charé åãCharSequenceãStringãStringBuilderãStringBuffer(JSONæååãäžæåã®å Žåã¯charã§ãããããããª)(Characteré åã¯ãã¡ã ã£ããããª) (enumåãOK) (æ¥ä»æå»å(java.util.Date, java.util.Calendar)ãOKããã ãjava.sql.Dateã¯æ³šæãå¿ èŠ)(Joda TimeãšãããOSSã®æ¥ä»æå»é¢é£ã®ã©ã€ãã©ãªã察å¿ããŠããããã)
char[],CharSequence,String,StringBuilder,StringBufferboolean,Boolean: æååã"true"ã"false"ã§ããã°ãã·ãªã¢ã©ã€ãºã§ããã倧æåå°æåã¯å³å¯ã«äžèŽããŠããªããã°ãªããªãããã以å€ã§ã¯ãã·ãªã¢ã©ã€ãºã«å€±æãããchar,Characterbyte,short,int,long,Byte,Short,Integer,Long,BigInteger,float,double,Float,Double,BigDecimalNumber
-
JSONæ°å€: JSONã®æ°å€ã¯æŽæ°ãšå®æ°ã«åãããããæŽæ°ã¯å°æ°ç¹ãææ°è¡šèšã®ãããã䜿ãããŠããªãæ°å€ã宿°ã¯å°æ°ç¹ãšææ°è¡šèšã®ããããããŸãã¯äž¡æ¹ã䜿ãããŠããæ°å€ã®ããšãããã§ã¯
1.0ã®ããã«ãå€èªäœãæŽæ°ã§ãã£ãŠãã衚èšã«å°æ°ç¹ãææ°è¡šèšã䜿ãããŠãããªã宿°ãšåŒã¶ã- JSONæŽæ°(å°æ°ç¹ããææ°è¡šèšããªãJSONæ°å€):
boolean,Boolean:0ã®ãšãã¯false,ãã以å€ã®ãšãã¯trueã«ãªããchar,Character: JSONæŽæ°ã«å¯Ÿå¿ããã³ãŒããã€ã³ãã®æåã«ãªãã- æ°å€å(
byte,short,int,long,float,double,Byte,Short,Integer,Long,Float,Double,BigInteger):char,byte,short,intãšãã®ã©ãããŒåã§ããCharacter,Byte,Short,Integerã®å Žåã¯ããã®åã§è¡šçŸã§ããç¯å²ã«åãŸããªãå€ãããã·ãªã¢ã©ã€ãºããããšãããšããã·ãªã¢ã©ã€ãºã«å€±æãããlongãšãã®ã©ãããŒåã§ããLongã®å Žåã¯ããã·ãªã¢ã©ã€ãºã¯å€±æããªããããã·ãªã¢ã©ã€ãºçµæã®å€ã¯äžæ£ç¢ºãªå€ã«ãªãã BigDecimal: 粟床ã¯JSONæŽæ°ã®æ¡æ°ãã¹ã±ãŒã«ã¯0Number(ã·ã³ãã«ããŒã¿ãã€ã³ãã£ã³ã°)Object(ã·ã³ãã«ããŒã¿ãã€ã³ãã£ã³ã°)String,CharSequence: å å®¹ãæ°å€ã®String(char[]ã«ã¯ãã·ãªã¢ã©ã€ãºã§ããªãã)StringBuilder,StringBuffer: äžå¿æå®ã§ãããããã·ãªã¢ã©ã€ãºçµæã¯äœãappendãããŠããªãStringBuilderããã³StringBufferãšãªãã- åæå: æå®ãããåæåã«ãJSONæŽæ°ãšå¯Ÿå¿ããã€ã³ããã¯ã¹ã®åæå€ãããã°ããã®å€ã«ãã·ãªã¢ã©ã€ãºãããããªããã°ãã·ãªã¢ã©ã€ãºã倱æããã(
FAIL_ON_NUMBERS_FOR_ENUMSãæå¹ã«ããããšã§ãåæåãæå®ããããšãã«ããã·ãªã¢ã©ã€ãºã«å€±æããããã«ã§ãã)
- JSON宿°(å°æ°ç¹ããææ°è¡šèšã®ããããããŸãã¯äž¡æ¹ãããJSONæ°å€):
- æŽæ°å(
byte,short,int,long,Byte,Short,Integer,Long,BigInteger): å°æ°ç¹ä»¥äžã¯åãæšãŠ - 宿°å(
float,double,Float,Double) BigDecimal: ç²ŸåºŠã¯æŽæ°éšãšå°æ°éšã®æ¡æ°ã®åèš(ãã ããæŽæ°éšã0ã§æãå Žåã¯æ¡æ°ã0ãšãã)ãã¹ã±ãŒã«ã¯å°æ°ç¹ä»¥äžã®æ¡æ°-ææ°éšã®å€(å°æ°ç¹è¡šèšã§ç¡ãå Žåã¯ãå°æ°ç¹ä»¥äžã®æ¡æ°ã0ãšããŠèšç®ãããææ°è¡šèšã§ãªãå Žåã¯ãææ°éšã®å€ã0ãšããŠèšç®ãã)Number(ã·ã³ãã«ããŒã¿ãã€ã³ãã£ã³ã°)Object(ã·ã³ãã«ããŒã¿ãã€ã³ãã£ã³ã°)String,CharSequence: å å®¹ãæ°å€ã®String(char[]ãStringBuilderãStringBufferã«ã¯ãã·ãªã¢ã©ã€ãºã§ããªãã)çµæã®æååã¯ãJSONæ°å€ãšããŠæžãããŠãã衚èšãšäžåäžå¥åãæååã«ãªããäŸãã°ã12.3ãš123E-1ãš123e-004ãšã§ã¯ãã·ãªã¢ã©ã€ãºçµæã¯ããããéãæååã«ãªããchar,Character, åæåãªã©ã¯æå®ã§ããªã
- æŽæ°å(
- JSONæŽæ°(å°æ°ç¹ããææ°è¡šèšããªãJSONæ°å€):
-
JSONçåœå€:
boolean,BooleanObject(ã·ã³ãã«ããŒã¿ãã€ã³ãã£ã³ã°)StringãCharSequenceãæå®ãããšStringã«ãã·ãªã¢ã©ã€ãºãããfalseã®å Žåã¯"false"ã«ãtrueã®å Žåã¯"true"ã«ãªãã(charé åãStringBuilderãStringBufferã«ã¯ãã·ãªã¢ã©ã€ãºã§ããªãã)
-
JSON nullå€:
- åç
§å:
nullã«ãã·ãªã¢ã©ã€ãºãããã - ããªããã£ãå: ããã©ã«ãå€ã«ãã·ãªã¢ã©ã€ãºãããã(
FAIL_ON_NULL_FOR_PRIMITIVESãæå¹ã«ãããšãšã©ãŒã«ãªã)
- åç
§å:
ãã·ãªã¢ã©ã€ãºå ãããªããã£ãåã§ããã·ãªã¢ã©ã€ãºå ã®JSONã®å€ãnullå€ã§ãããšãããã·ãªã¢ã©ã€ãºçµæã®å€ã¯ããã©ã«ãå€ã«ãªã(ã¡ãªã¿ã«ãã®ããã©ã«ãå€ãšããã®ã¯ãJavaã®èšèªä»æ§ã§æç¢ºã«å®çŸ©ãããŠããæŠå¿µã§ãã¯ã©ã¹å€æ°ãã€ã³ã¹ã¿ã³ã¹å€æ°ãé åã®èŠçŽ ã®å€ãæå®ããªãã£ãå Žåã®å€ã¯ãã®ããã©ã«ãå€ã«åæåããã)ãããªããã£ãåãšããã©ã«ãå€ã®å¯Ÿå¿ã以äžã«ç€ºãã
| ããªããã£ãå | ããã©ã«ãå€ |
|---|---|
boolean | false |
char | '\u0000' |
byte | (byte) 0 |
short | (short) 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
DeserializationConfig.Feature.FAIL_ON_NULL_FOR_PRIMITIVESãæå¹ã«ããããšã§ãããã©ã«ãå€ã«ãã·ãªã¢ã©ã€ãºãããã®ã§ã¯ãªãããã·ãªã¢ã©ã€ãºã倱æããããã«å€æŽã§ããã
ãã ãããªããã£ãåãèŠçŽ åãšããé
åã®å Žåã«ã¯ãFAIL_ON_NULL_FOR_PRIMITIVESãæå¹ã«ããŠããã·ãªã¢ã©ã€ãºã«å€±æããããã«ã¯ãªããªãã®ã§æ³šæããããšã
ãŸããcharé
ååã§ã¯ãèŠçŽ ã®å€ãnullå€ãã©ããã«é¢ä¿ãªããããããJSONé
åãããã·ãªã¢ã©ã€ãºã§ããªãã®ã§ãFAIL_ON_NULL_FOR_PRIMITIVESã®æå¹ã»ç¡å¹ã«é¢ä¿ãªããå¿
ããã·ãªã¢ã©ã€ãºã«å€±æããã
AbstractTypeResolver, MrBean
JavaBeanãšã®ãã€ã³ãã£ã³ã°
ã²ãã¿ãŒãã»ãã¿ãŒããã£ãŒã«ããã¯ãªãšãŒã¿ãŒã®èªåæ€åº
èªåæ€åºã®å¯èŠæ§ SerializationConfig.Feature.AUTO_DETECT_GETTERS SerializationConfig.Feature.AUTO_DETECT_IS_GETTERS SerializationConfig.Feature.AUTO_DETECT_FIELDS DeserializationConfig.Feature.AUTO_DETECT_SETTERS DeserializationConfig.Feature.AUTO_DETECT_CREATORS DeserializationConfig.Feature.AUTO_DETECT_FIELDS @AutoDetect VisibilityChecker
PropertyNamingStrategy
ã²ãã¿ãŒãã»ãã¿ãŒããJacksonãæ±ºå®ããããããã£åãšãJava Beansã®ä»æ§ã®éãã®åé¡
Javaã®åºæ¬çãªããŒã¿æ§é ãžã®ãã€ã³ãã£ã³ã°
| JSONã®å | Javaã®å |
|---|---|
| ãªããžã§ã¯ã | LinkedHashMap<String, Object> |
| é å | ArrayList<Object> |
| æåå | String |
| æ°å€(æŽæ°) | Integer, Long, BigInteger |
| æ°å€(宿°) | Double |
| çåœå€ | Boolean |
| nullå€ | null |
JSONã®ãªããžã§ã¯ãã¯HashMapã§ã¯ãªããLinkedHashMapã«ã·ãªã¢ã©ã€ãºãããã®ã§ãJSONããã¹ãäžã§åºçŸããããããã£ã®é çªãä¿åãããŠããã(ãšã¯ããJSONã®ãªããžã§ã¯ãã¯ãããããã£ã®é çªã«æå³ãæããªãã®ãæ³å®ãããããããã®é çªã«äŸåããåŠçã¯ãã¹ãã§ã¯ãªãã ãã)
æŽæ°ã¯å°æ°ç¹ãææ°è¡šèšã®ãªãæ°å€ã宿°ã¯å°æ°ç¹ãææ°è¡šèšã®ããããããŸãã¯äž¡æ¹ãããæ°å€ã®ããšã
JSONã®æ°å€(æŽæ°)ã«å¯Ÿå¿ããJavaã®åã¯ãIntegerãLongãBigIntegerã®äžã§ãJSONã®æŽæ°ã衚çŸã§ããæå°ã®åãéžã°ããã
DeserializationConfig.Feature.USE_BIG_INTEGER_FOR_INTSãæå¹ã«ããããšã§åžžã«BigIntegeråã«ãã·ãªã¢ã©ã€ãºãããããã«ã§ããã
DeserializationConfig.Feature.USE_BIG_DECIMAL_FOR_FLOATSãæå¹ã«ããããšã§Doubleã§ã¯ãªãBigDecimalã«ãã·ãªã¢ã©ã€ãºãããããã«ã§ããã
java.util.Dateãšjava.util.Calendarã®ã·ãªã¢ã©ã€ãº/ãã·ãªã¢ã©ã€ãºãã§ããã
æ¥ä»æå»åã¯ãšããã¯ã¿ã€ã (1970-01-01 UTCããã®ããªç§åäœã®çµéæå»)ãè¡šãæŽæ°ã«ã·ãªã¢ã©ã€ãºãããã
WRITE_DATES_AS_TIMESTAMPSãç¡å¹ã«ããããšã§ãISO-8601ã«æºæ ãã圢åŒã«ã·ãªã¢ã©ã€ãºã§ããã(äŸ: "1970-01-01T00:00:00.000+0000")
RFC-1123ãISO-8601圢åŒã®æååãšããšããã¯ã¿ã€ã ã®æŽæ°ããã·ãªã¢ã©ã€ãºã§ããã
Joda TimeãšããOSSã®æ¥ä»æå»ã©ã€ãã©ãªã®DateTimeãjava.util.Dateãšåæ§ã«ããŠåŠçããã
java.sql.Dateã¯äœ¿ããªãããã«ãJacksonã¯java.sql.DateããµããŒãããŠãããããã®ã¯ã©ã¹ã®èšèšã«éšåçã«èµ·å ããŠãã¿ã€ã ãŸãŒã³ã®åãæ±ãã«åé¡ãããããšãåãã£ãŠããããã®ã¯ã©ã¹ã䜿ãã®ã¯é¿ããŠã代ããã«å¯èœãªéãjava.util.Dateãjava.util.Calendarã䜿ãããšããããé£ããã®ãªããjava.util.Calendarã䜿ã£ãŠæç€ºçã«ã¿ã€ã ãŸãŒã³ãæå®ããŠã倿ããå¿
èŠããããããããªãã
java.text.DateFormatã§ã·ãªã¢ã©ã€ãº/ãã·ãªã¢ã©ã€ãºãã«ã¹ã¿ãã€ãºã§ããã
objectMapper.setDateFormat(...); // 1.8以éãã·ãªã¢ã©ã€ãºãšãã·ãªã¢ã©ã€ãºã®äž¡æ¹ãã«ã¹ã¿ãã€ãº
objectMapper.getSerializationConfig().setDateFormat(...); // 1.8以éã¯éæšå¥šãã·ãªã¢ã©ã€ãºã®ã¿
objectMapper.getDeserializationConfig().setDateFormat(...); // 1.8以éã¯éæšå¥šããã·ãªã¢ã©ã€ãºã®ã¿JSONã®ããŒã¿æ§é ã衚ãJavaãªããžã§ã¯ãã§JSONãæ±ãåŠçã¢ãã«ãXMLã®DOMã«çžåœããã
ããªãŒã¢ãã«ã䜿ãã«ã¯Mapperã¢ãžã¥ãŒã«(ãšäŸåããCoreã¢ãžã¥ãŒã«)ãå¿ èŠ
JSONããã¹ãããããªãŒã¢ãã«ãçæããã«ã¯ãããŒã¿ãã€ã³ãã£ã³ã°ãšåæ§ã«ObjectMapperãªããžã§ã¯ãã®readValue()ã¡ãœãããäœ¿ãæ¹æ³ãšãããªãŒã¢ãã«ã§èªã¿èŸŒãå°çšã®readTree()ã¡ãœãããäœ¿ãæ¹æ³ãããã
readValue()ã¡ãœãããäœ¿ãæ¹æ³
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readValue(src, JsonNode.class);readTree()ã¡ãœãããäœ¿ãæ¹æ³
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(src);JsonNode#get(int index): JSONé åã®indexã«ããèŠçŽ ãè¿ããindexã¯0ãªãªãžã³ãindexãé åã®ç¯å²å€(0æªæºãé åã®ãµã€ãºä»¥äž)ãªãnull- ããŒãã
ArrayNodeåã§ãªããªãnull - JSONã®nullå€ã¯
NullNodeåã§ãããJavaã®nullã§ã¯ãªãã®ã§åºå¥ã§ããã
JsonNode#get(String property): JSONãªããžã§ã¯ãã®ååãpropertyã®å€ãšäžèŽããããããã£ã®å€ãè¿ãã- ååã
propertyã®å€ãšäžèŽããããããã£ããªããªãnull - ããŒãã
ObjectNodeåã§ãªããªãnull - JSONã®nullå€ã¯
NullNodeåã§ãããJavaã®nullã§ã¯ãªãã®ã§åºå¥ã§ããã
- ååã
JsonNode#path(int index),JsonNode#path(String property):get(int)ãget(String)ãšäŒŒãŠããããå€ãèŠã€ãããªãå Žåã«Javaã®nullãè¿ãã®ã§ã¯ãªããMissingNodeãè¿ããMissingNodeã¯JsonNodeã®ã¡ãœããããã¹ãŠå®è£ ããŠãããããããããŒããååŸããã¡ãœããã¯åžžã«MissingNodeãè¿ããããã«ããè€æ°ã®ããããã£ãé åã®ã€ã³ããã¯ã¹ãçµç±ããŠå€ãååŸãããšãã«ãnullãã§ãã¯ãè¡ããªããŠããã #ããããNullãªããžã§ã¯ããã¿ãŒã³
JsonNode#with(String property):path(String)ã¡ãœãããšäŒŒãŠããããMissingNodeãè¿ãã®ã§ã¯ãªããæ°ããObjectNodeãçæããŠããŒãã«è¿œå ãã远å ããObjectNodeãè¿ãã #with(int index)ããªãã®ã¯ãªãã ããã- è€æ°ã®(ååšãããåãããªã)ããããã£ãçµç±ããŠãå€ãèšå®ããéã«ãããããã£ãååšãããã©ããããã§ãã¯ããŠãèªåã§
ObjectNodeãçæããŠã远å ããªããŠããã
- è€æ°ã®(ååšãããåãããªã)ããããã£ãçµç±ããŠãå€ãèšå®ããéã«ãããããã£ãååšãããã©ããããã§ãã¯ããŠãèªåã§
ObjectNodeã®çæã«ã¯ObjectMapperãªããžã§ã¯ãã®createObjectNode()ã¡ãœããã䜿ãã
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.createObjectNode();TODO: ArrayNodeã®çæ TODO: JSONãªããžã§ã¯ããJSONé åã®èŠçŽ ã®å€ã倿Žããã«ã¯ãObjectNodeãArrayNodeã«ãã£ã¹ãããå¿ èŠãããã
ããªãŒã¢ãã«ã®JSONãžã®å€æã¯éåžžã®Javaãªããžã§ã¯ãã®å Žåãšåæ§ã«ObjectMapperãªããžã§ã¯ãã®writeValue()ã¡ãœããã䜿ãã
JsonNode rootNode = ...;
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.writeValue(dst, rootNode);JsonParserã®é ãåç §
ããªãŒã¢ãã«ãäžæŠããŒã¯ã³ã®ã¹ããªãŒã ã«å€æããŠãããJavaãªããžã§ã¯ãã«å€æããããšãã§ããããObjectMapperãªããžã§ã¯ãã®treeToValue()ã¡ãœããã䜿ãããšãã§ããã
JsonNode node = ...;
MyBean bean = objectMapper.treeToValue(node, MyBean.class);JSONããã¹ããããŒã¯ã³ã®ã¹ããªãŒã ãšããŠæ±ãåŠçã¢ãã«ãXMLã®StAXã«çžåœããã
ã¹ããªãŒãã³ã°APIã䜿ãã«ã¯Coreã¢ãžã¥ãŒã«ãå¿ èŠã
Jacksonã®åŠçã¢ãã«ã®äžã§æãå¹ççãªåŠçã¢ãã«ãã¡ã¢ãªãåŠçéåºŠã®æå°éã®ãªãŒããŒãããã æ§èœãšåŒãæãã«äœ¿ãåæã¯ããŸããããªãã
- JSONãèªã¿èŸŒãé åºãšåãé çªã§åŠçããªããã°ãªããªãããªããžã§ã¯ããé åã®èŠçŽ ã«ã©ã³ãã ã¢ã¯ã»ã¹ããã«ã¯ããŒã¿ãã€ã³ãã£ã³ã°ãããªãŒã¢ãã«ã䜿ãå¿ èŠãããã
- ãªããžã§ã¯ããé åãªã©ã®ããŒã¿æ§é ã¯èªåã§äœããªããšãããªãã
JSONããã¹ããã
File file = ...; // å
¥åãšãªãJSONããã¹ã
JsonFactory jsonFactory = new JsonFactory(); // or MappingJsonFactory
JsonParser jp = jsonFactory.createJsonParser(file);ããªãŒã¢ãã«ãã
JsonNode node = ...;
JsonParser jp = node.traverse();ãŸãã¯
ObjectMapper objectMapper = new ObjectMapper();
JsonNode node = ...;
JsonParser jp = objectMapper.treeAsTokens(node);TokenBufferãã
TokenBuffer buffer = ...;
JsonNode root = objectMapper.readTree(buffer.asParser());ãã¡ã€ã«ã«æžãåºã
File file = ...; //ãåºåå
ãšãªããã¡ã€ã«
JsonFactory jsonFactory = new JsonFactory(); // or MappingJsonFactory
JsonGenerator jg = jsonFactory.createJsonGenerator(file, JsonEncoding.UTF8);TokenBufferã¯JsonGeneratorãç¶æ¿ããŠãã
TokenBuffer buffer = new TokenBuffer();SerializationConfig.Feature DeserializationConfig.Feature JsonGenerator.Feature JsonParser.Feature
XCã¢ãžã¥ãŒã«ã䜿ããšãJacksonã®ã¢ãããŒã·ã§ã³ã®ä»£ããã«JAXBã®ã¢ãããŒã·ã§ã³ã䜿ããã
MrBeanã®æ©èœãå©çšããã«ã¯MrBeanã¢ãžã¥ãŒã«(ãšäŸåããMapperã¢ãžã¥ãŒã«ãCoreã¢ãžã¥ãŒã«)ãå¿ èŠ
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new MrBeanModule());
ObjectMapper mapper = new ObjectMapper();
// AbstractTypeMaterializerã¯AbstractTypeResolverãç¶æ¿ããŠãã
mapper.getDeserializationConfig().setAbstractTypeResolver(new AbstractTypeMaterializer());gson(google-json)ãJSONICãªã©
JSR 343ã®ãŠã©ãã