You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对io.circe.Json对象进行模式匹配以实现JSON比较?

针对circe JSON对象比较的优化方案

circe的io.circe.Json是密封特质,其具体实现类(如JArray、JObject)为包私有,无法直接通过类型匹配,但可以利用Json伴生对象提供的提取器实现更优雅的模式匹配,替代条件判断写法。

优化后的递归匹配代码示例

import io.circe.{Json, JsonObject}

def compareJson(json1: Json, json2: Json): Boolean = (json1, json2) match {
  // 匹配两个JSON对象
  case (Json.JObject(obj1), Json.JObject(obj2)) =>
    obj1.keys == obj2.keys && obj1.forall { case (k, v) => compareJson(v, obj2(k)) }
  // 匹配两个JSON数组
  case (Json.JArray(arr1), Json.JArray(arr2)) =>
    arr1.length == arr2.length && arr1.zip(arr2).forall { case (a, b) => compareJson(a, b) }
  // 匹配基础类型(字符串、数字、布尔、null)
  case (a, b) => a == b
}

方案优势

  • 代码简洁直观,符合Scala模式匹配的惯用写法
  • 无需依赖isArray/isObject这类条件判断,直接通过提取器匹配具体类型
  • 覆盖所有JSON类型的匹配场景,避免遗漏

补充说明

如果需要更细粒度的基础类型匹配(比如区分数字、字符串等),可进一步拆分分支:

case (Json.JString(s1), Json.JString(s2)) => s1 == s2
case (Json.JNumber(n1), Json.JNumber(n2)) => n1 == n2
case (Json.JBoolean(b1), Json.JBoolean(b2)) => b1 == b2
case (Json.JNull, Json.JNull) => true

内容的提问来源于stack exchange,提问作者pme

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:32:38