ツリーモデルAPIでJSONデータを読み込む
前回は
ツリーモデルの核になるのは、
// 配列のノードから2番目の子ノードを取得
JsonNode secondNode = node.get(2);
// オブジェクトのノードからフィールド名「name」のノードを取得
JsonNode nameNode = node.get("name");
// ノードから文字列値を取得
String value = node.getStringValue();
ファイルかデータを読み込んでツリーを構築するにはObjectMapperクラスを利用します。まず、
// ObjectMapperを作成
ObjectMapper mapper = new ObjectMapper();
// mydata.jsonからルートノードを取得
JsonNode rootNode = mapper.readValue(new File("mydata.json"), JsonNode.class);
今回は、
[{
"name" : { "first" : "太郎", "last" : "技評" },
"mail" : "[email protected]"
},
{
"name" : { "first" : "次郎", "last" : "技術" },
"mail" : "[email protected]"
},
{
"name" : { "first" : "花子", "last" : "評論" },
"mail" : "[email protected]"
}]
このデータを読み込んで、
// ObjectMapperを作成
ObjectMapper mapper = new ObjectMapper();
// ルートノードを取得
JsonNode rootNode = mapper.readValue(new File("mydata.json"), JsonNode.class);
JsonNode current;
for (int i=0; (current = rootNode.get(i)) != null; i++) {
// "name"オブジェクトのノードを取得
JsonNode nameNode = current.get("name");
System.out.println("name: ");
// "name"オブジェクトのフィールドデータを取得して表示
Iterator<String> nameNodeFields = nameNode.getFieldNames();
while (nameNodeFields.hasNext()) {
String nameNodeField = nameNodeFields.next();
System.out.println(" " + nameNodeField + ": " + nameNode.get(nameNodeField));
}
// "mail"フィールドのノードを取得してデータを表示
JsonNode mailNode = current.get("mail");
System.out.println("mail: " + mailNode.getTextValue());
}
この例では、
name:
first: "太郎"
last: "技評"
mail: [email protected]
name:
first: "次郎"
last: "技術"
mail: [email protected]
name:
first: "花子"
last: "評論"
mail: [email protected]
このコードを実行すると、
ツリーモデルAPIでJSONデータを書き出す
続いて、
- ArrayNode
- ObjectNode
- BinaryNode
- BooleanNode
- NumericNode
- POJONode
- TextNode
- NullNode
ArrayNodeにノードや値を追加するには、
ObjectNode firstObject = rootNode.addObject();
ObjectNodeにノードや値を追加する場合には、
ObjectNode nameObject1 = firstObject.putObject("name");
起点となるノードは、
// ルートノードを配列として作成する場合
ArrayNode rootNode = mapper.createArrayNode();
// ルートノードを配列として作成する場合
ObjectNode rootNode = mapper.createObjectNode();
作成したJSONデータをファイルへ出力するにはObjectMapperのwrite()メソッドを使います。このメソッドにノードオブジェクトを渡すと、
mapper.writeValue(new File("output.json"), rootNode);
以上を踏まえて、
[{
"name":{"first":"太郎","last":"技評"},
"mail":"[email protected]"
},{
"name":{"first":"次郎","last":"技術"},
"mail":"[email protected]"
}]
ネストを含む複数のオブジェクトが配列に格納されている形のデータです。これは次のようなコードで生成できます。
// ObjectMapperを作成
ObjectMapper mapper = new ObjectMapper();
// ルートノードを配列として作成
ArrayNode rootNode = mapper.createArrayNode();
// 「技評太郎」のデータを追加
ObjectNode firstObject = rootNode.addObject();
ObjectNode nameObject1 = firstObject.putObject("name");
nameObject1.put("first", "太郎");
nameObject1.put("last", "技評");
firstObject.put("email", "[email protected]");
// 「技術次郎」のデータを追加
ObjectNode secondObject = rootNode.addObject();
ObjectNode nameObject2 = firstObject.putObject("name");
nameObject2.put("first", "次郎");
nameObject2.put("last", "技術");
secondObject.put("mail", "[email protected]");
// ファイルへ書き出し
try {
mapper.writeValue(new File("output.json"), rootNode);
} catch (IOException ex) {
ex.printStackTrace();
}
Javaオブジェクトとのバインディングもサポート
Jacksonには、
前者の場合、
JSONの型 | Javaのクラス |
---|---|
オブジェクト | LinkedHashMap<String,Object> |
配列 | ArrayList<Object> |
文字列 | String |
整数 | Integer, Long, BigInteger |
浮動小数点数 | Double |
true/ | Boolean |
null | null |
後者の場合、
public class User {
private Name name;
private String mail;
......
}
public class Name {
private String first;
private String last;
......
}
このとき、
Name name = new Name("太郎", "技評");
User user = new User(name1, "[email protected]");
mapper.writeValue(new File("output.json"), user);
このように、