1. 序章

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

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

<build>
    <plugins>
        // ...
        <plugin>
            <groupId>org.codehaus.gmavenplus</groupId>
            <artifactId>gmavenplus-plugin</artifactId>
            <version>1.6</version>
        </plugin>
    </plugins>
</build>
<dependencies>
    // ...
    <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>2.4.13</version>
    </dependency>
</dependencies>

最新のMavenプラグインはここと最新バージョンのgroovy-allここにあります。

2. GroovyオブジェクトをJSONに解析する

GroovyでオブジェクトをJSONに変換するのは非常に簡単です。アカウントクラスがあるとしましょう。

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)

その結果、解析されたJSON String:を取得します

{"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 アカウントクラスに解析します:

def jsonSlurper = new JsonSlurper()

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

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

また、JSON StringMapに解析し、をキャストせずに呼び出すことができます。また、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. パーサーバリアント

また、 JsonParserType、内には、他のいくつかの実装があります。

  • JsonParserType.LAX を使用すると、コメント付き、引用文字列なしなど、よりリラックスしたJSON解析が可能になります。
  • JsonParserType.CHARACTER_SOURCE は、大きなファイルの解析に使用されます。

4. 結論

GroovyアプリケーションでのJSON処理の多くを、いくつかの簡単な例で説明しました。

groovy.json パッケージクラスの詳細については、 GroovyDocumentationを参照してください。

GitHubリポジトリで、この記事で使用されているクラスのソースコードといくつかの単体テストを確認してください。