GroovyでJSONを操作する
1. 前書き
2. GroovyオブジェクトをJSONに解析する
GroovyでオブジェクトをJSONに変換するのは非常に簡単です。Accountクラスがあるとしましょう。
class Account {
String id
BigDecimal value
Date createdAt
}
そのクラスのインスタンスをJSONString,に変換するには、JsonOutputクラスを使用して、静的メソッドtoJson():を呼び出す必要があります。
Account account = new Account(
id: '123',
value: 15.6,
createdAt: new SimpleDateFormat('MM/dd/yyyy').parse('01/01/2018')
)
println JsonOutput.toJson(account)
その結果、解析されたJSONString:が取得されます
{"value":15.6,"createdAt":"2018-01-01T02:00:00+0000","id":"123"}
2.1. JSON出力のカスタマイズ
ご覧のとおり、日付の出力は私たちが望んでいたものではありません。 そのために、バージョン2.5以降、パッケージgroovy.jsonには専用のツールセットが付属しています。
JsonGeneratorクラスを使用して、JSON出力のオプションを定義できます。
JsonGenerator generator = new JsonGenerator.Options()
.dateFormat('MM/dd/yyyy')
.excludeFieldsByName('value')
.build()
println generator.toJson(account)
その結果、除外した値フィールドがなく、フォーマットされた日付を持つフォーマットされたJSONが取得されます。
{"createdAt":"01/01/2018","id":"123"}
2.2. JSON出力のフォーマット
上記のメソッドを使用すると、JSON出力は常に1行で表示され、より複雑なオブジェクトを処理する必要がある場合は混乱する可能性があることがわかりました。
ただし、prettyPrintメソッドを使用して出力をフォーマットできます。
String json = generator.toJson(account)
println JsonOutput.prettyPrint(json)
そして、以下のフォーマットされたJSONを取得します。
{
"value": 15.6,
"createdAt": "01/01/2018",
"id": "123"
}
3. JSONをGroovyオブジェクトに解析する
GroovyクラスJsonSlurperを使用してJSONからObjects.に変換します
また、JsonSlurperには、オーバーロードされたparseメソッドと、parseText、parseFile,などのいくつかの特定のメソッドがあります。
parseTextを使用してStringをAccount class:に解析します
def jsonSlurper = new JsonSlurper()
def account = jsonSlurper.parseText('{"id":"123", "value":15.6 }') as Account
上記のコードには、JSONStringを受け取り、Accountオブジェクトを返すメソッドがあります。これは任意のGroovyオブジェクトです。
また、JSONStringをMap,に解析して、キャストなしで呼び出すことができます。Groovy動的型付けを使用すると、オブジェクトと同じものを使用できます。
3.1. JSON入力の解析
JsonSlurperのデフォルトのパーサー実装はJsonParserType.CHAR_BUFFERですが、場合によっては、解析の問題に対処する必要があります。
この例を見てみましょう。日付プロパティを持つJSONStringが与えられた場合、JsonSlurperは日付をString:として解析しようとするため、オブジェクトを正しく作成しません。
def jsonSlurper = new JsonSlurper()
def account
= jsonSlurper.parseText('{"id":"123","createdAt":"2018-01-01T02:00:00+0000"}') as Account
その結果、上記のコードは、null値を含むすべてのプロパティを持つAccountオブジェクトを返します。
その問題を解決するために、JsonParserType.INDEX_OVERLAY.を使用できます
その結果、Stringまたはchar配列の作成を回避するために可能な限り努力します。
def jsonSlurper = new JsonSlurper(type: JsonParserType.INDEX_OVERLAY)
def account
= jsonSlurper.parseText('{"id":"123","createdAt":"2018-01-01T02:00:00+0000"}') as Account
これで、上記のコードは適切に作成されたAccountインスタンスを返します。
3.2 Parser Variants
また、JsonParserType,の中には、他にもいくつかの実装があります。
-
JsonParserType.LAXを使用すると、コメント付き、引用符なしなど、よりリラックスしたJSON解析が可能になります。
-
JsonParserType.CHARACTER_SOURCEは、大きなファイルの解析に使用されます。
4. 結論
GroovyアプリケーションでのJSON処理の多くを、いくつかの簡単な例で説明しました。
groovy.jsonパッケージクラスの詳細については、Groovy Documentationを参照してください。
この記事で使用されているクラスのソースコードと、いくつかの単体テストをGitHub repositoryで確認してください。