LoginSignup
1
0

【Java】Jacksonを使ってJSONを比較する

Posted at

TL;DR

  • Jacksonを使うことで、単純に文字列では比較できないJSONも比較できる
    • 単なる一致チェックにとどまらず、柔軟な比較も可能

やりたいこと

以下のような、期待値のJSONが有ったとします。

expected.json
{
  "foo": "foo",
  "bar": 1,
  "baz": true
}

一方で、Java上で得られるJSONは以下のような形式だったとします。

String actual = "{\"bar\":1,\"baz\":true,\"foo\":\"foo\"}";

このような場合に、この2つがJSONとして等しいことをテストします1

やり方

題の通り、Jacksonを使ったやり方を紹介します。

JacksonではreadTreeJsonNodeという型を読み出せます。
これはequalsを実装しているため、単純比較は特別な処理を書かなくても可能です。

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;

import java.io.FileInputStream;;
import java.io.IOException;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class JacksonJsonTest {
  @Test
  void test() throws IOException {
    ObjectMapper mapper = new ObjectMapper();

    String actual = "{\"bar\":1,\"baz\":true,\"foo\":\"foo\"}";

    JsonNode actualNode = mapper.readTree(actual);
    // ファイルからの期待値JSON読み込み
    JsonNode expectedNode = mapper.readTree(new FileInputStream("src/test/resources/expected.json"));

    assertEquals(expectedNode, actualNode);
  }
}

このやり方の利点

調べた限り、このような比較を行うためのテスト用ライブラリなども有りそうでした。

それらに比べてJacksonが優れているのは、Spring等にデフォルトで導入されている点です。
JSONに関して何か処理が必要になった場合はまず導入されているJSONライブラリで実現できないかから確認することをお勧めします。

また、JsonNodeに実装されている関数を応用することで、ファジーな値比較や、特定プロパティのみの比較、特定プロパティの無視といった柔軟な比較も可能です。
このような機能性も利点の一つです。

  1. 具体的には、大きなJSONの出力結果をテストする際に、期待値は整形済みJSONで管理したいが、出力は整形できないという状況で、この方法で比較を行いました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0