JacksonでJSONを生成する

## Jacksonとは
JSONをJavaで取り扱うためのいろいろなクラスやインターフェースを提供してくれるAPI。

Jacksonには以下の3つのjarが用意されている。

- Jackson Core  
ストリーミング、パーサー、ジェネレータ機能を含むパッケージ
- Jackson Annotations  
アノテーションが用意されたパッケージ
- Jackson databind  
データバインディングとツリーモデルを提供してくれるパッケージ

これらの説明は次のリンクで

- JSONの解説
[JSON - Wikipedia](https://ja.wikipedia.org/wiki/JavaScript_Object_Notation)
[JSONホーム](http://memopad.bitter.jp/w3c/json/index.html)

- Jacksonうんぬん
~~[Jackson Home](http://wiki.fasterxml.com/JacksonHome)~~ <-- 昔はあったんですが、今はもうないようです
[Jackson Github](https://github.com/FasterXML/jackson)
[Jacksonの便利な使い方 [初心者向け] - Qiita](http://qiita.com/takehiro224/items/6db2841c0abbf4ffb233)

## JsonFactoryクラス
Jacksonのファクトリークラス。

### createGeneratorメソッド
JSONジェネレーターを生成するメソッドで、これを記述しないと始まらない。
第1引数にはFile、OutputStream、Writer型を指定して、Writer型以外は第2引数にJSONEncodingを指定することができる。尚、バージョン2.2以前はcreateJSONGeneratorメソッドも使われていたが、2.2以降は使用できなくなっている。

## JsonGenerator抽象クラス

### writeStartObject抽象メソッド
"{"を書き込む抽象メソッド。

### writeFieldName抽象メソッド
フィールド名を記述する抽象メソッド。

### writeStartArray抽象メソッド
配列の初めを表す"["を記述する抽象メソッド。

### flush抽象メソッド
createGeneratorメソッドで指定したOutputStreamとWriterを指定したディレクトリに出力する抽象メソッド。

### writeStringFieldメソッド
第1引数にフィールド名、第2引数に値を指定するメソッド。

### writeBooleanFieldメソッド
第1引数にフィールド名、第2引数にBoolean値を指定するメソッド。

### writeEndObject抽象メソッド
"}"を書き込む抽象メソッド。

### writeEndArray抽象メソッド
配列の終わりを表す"]"を記述する抽象メソッド。

## 実際にJSONをJavaで生成してみる

```json:
{"fieldname1":"value1","isFieldname":true,"array":[{"fieldname2":"value2","fieldname3":"value3","fieldname4":"value4"}],"fieldname5":"value5"}
```

のようなJSONをJavaで記述したいとなったときは

```java:JSONFactorySample.java
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;

public class JSONFactorySample {

	public static void main(String[] args) throws IOException {
		Writer out = new PrintWriter("JSON/test.json");
		JsonFactory jsonFactory = new JsonFactory();
		JsonGenerator jsonGenerator = jsonFactory.createJsonGenerator(out);
		
		jsonGenerator.writeStartObject();                       //{
		jsonGenerator.writeStringField("fieldname1","value1");  //{"fieldname1":"value1"
		jsonGenerator.writeBooleanField("isFieldname",true);    //{"fieldname1":"value1","isFieldname":true,"array"
		jsonGenerator.writeFieldName("array");                  //{"fieldname1":"value1","isFieldname":true,"array":[
		jsonGenerator.writeStartArray();                        //{"fieldname1":"value1","isFieldname":true,"array":[
		jsonGenerator.writeStartObject();                       //{"fieldname1":"value1","isFieldname":true,"array":[{
		jsonGenerator.writeStringField("fieldname2","value2");  //{"fieldname1":"value1","isFieldname":true,"array":[{"fieldname2":"value2"
		jsonGenerator.writeStringField("fieldname3","value3");  //{"fieldname1":"value1","isFieldname":true,"array":[{"fieldname2":"value2","fieldname3":"value3"
		jsonGenerator.writeStringField("fieldname4","value4");  //{"fieldname1":"value1","isFieldname":true,"array":[{"fieldname2":"value2","fieldname3":"value3","fieldname4":"value4"
		jsonGenerator.writeEndObject();                         //{"fieldname1":"value1","isFieldname":true,"array":[{"fieldname2":"value2","fieldname3":"value3","fieldname4":"value4"}
		jsonGenerator.writeEndArray();                          //{"fieldname1":"value1","isFieldname":true,"array":[{"fieldname2":"value2","fieldname3":"value3","fieldname4":"value4"}]
		jsonGenerator.writeStringField("fieldname5","value5");  //{"fieldname1":"value1","isFieldname":true,"array":[{"fieldname2":"value2","fieldname3":"value3","fieldname4":"value4"}],"fieldname5":"value5"
		jsonGenerator.writeEndObject();                         //{"fieldname1":"value1","isFieldname":true,"array":[{"fieldname2":"value2","fieldname3":"value3","fieldname4":"value4"}],"fieldname5":"value5"}
		jsonGenerator.flush();                                  //Output to specified directory.
	}

}
```

と書くとJSONフォルダ内にtest.jsonが生成される。

## さいごに
codehausとかfasterxmlとかでバージョン違うし、はじめは違いがわからんかったw