GroovyでJSONを扱う

GroovyでJSONを操作する

1. 前書き

この記事では、GroovyアプリケーションでJSONを操作する方法の例を説明して確認します。

まず、この記事の例を実行して実行するには、pom.xmlを設定する必要があります。


    
        // ...
        
            org.codehaus.gmavenplus
            gmavenplus-plugin
            1.6
        
    


    // ...
    
        org.codehaus.groovy
        groovy-all
        2.4.13
    

最新のMavenプラグインはhereと最新バージョンのgroovy-allhereで見つけることができます。

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メソッドと、parseTextparseFile,などのいくつかの特定のメソッドがあります。

parseTextを使用してStringAccount class:に解析します

def jsonSlurper = new JsonSlurper()

def account = jsonSlurper.parseText('{"id":"123", "value":15.6 }') as Account

上記のコードには、JSONStringを受け取り、Accountオブジェクトを返すメソッドがあります。これは任意のGroovyオブジェクトです。

また、JSONStringMap,に解析して、キャストなしで呼び出すことができます。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で確認してください。