) fun compareJsonNodes( node1: JsonNode, node2: JsonNode, path: String = "", ): List<JsonNodeDiffInfo> { // JsonNodeのタイプに基づいて⽐較を⾏う return when { node1.isObject -> compareObjectNodes(node1, node2, path) node1.isArray -> compareArrayNodes(node1, node2, path) node1 != node2 -> listOf(createDiffInfo(path, "$node1 != $node2")) else -> emptyList() } } private fun createDiffInfo(path: String, reason: String): JsonNodeDiffInfo { return JsonNodeDiffInfo( path = path, reason = reason, ) } private fun compareObjectNodes( node1: JsonNode, node2: JsonNode, path: String, ): List<JsonNodeDiffInfo> { return node1.fields().asSequence().toList().flatMap { (key, value) -> val newPath = "$path/$key" if (node2.at("/$key").isMissingNode) { // 2つ⽬のJsonNodeに同じフィールドが存在しない場合、差分情報を⽣成 listOf(createDiffInfo(newPath, "missing path")) } else { // 同じフィールドが存在する場合、そのフィールドの値(JsonNode)に対して再帰的に⽐較を⾏う compareJsonNodes(value, node2.get(key), newPath) } } } private fun compareArrayNodes( node1: JsonNode, node2: JsonNode, path: String, ): List<JsonNodeDiffInfo> { return node1.flatMapIndexed { index, value -> val newPath = "$path/$index" if (node2.at("/$index").isMissingNode) { // 2つ⽬のJsonNodeに同じインデックスの要素が存在しない場合、差分情報を⽣成 listOf(createDiffInfo(newPath, "missing path")) } else { // 同じインデックスの要素が存在する場合、その要素(JsonNode)に対して再帰的に⽐較を⾏う compareJsonNodes(value, node2.get(index), newPath) } } }