Slide 19
Slide 19 text
Perl/Kotlinのレスポンス⽐較
data class JsonNodeDiffInfo(
val path: String,
val reason: String,
)
fun compareJsonNodes(
node1: JsonNode,
node2: JsonNode,
path: String = "",
): List {
// 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 {
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 {
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)
}
}
}