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

如何基于复杂JSON数据创建Scala对象并读取打印字段值

Scala JSON对象映射与读取实现

我们使用业界常用的Circe JSON库完成本次需求,步骤如下:

1. 引入依赖

在build.sbt中添加如下依赖:

val CirceVersion = "0.14.6"
libraryDependencies ++= Seq(
  "io.circe" %% "circe-core" % CirceVersion,
  "io.circe" %% "circe-generic" % CirceVersion,
  "io.circe" %% "circe-parser" % CirceVersion
)

2. 定义与JSON结构匹配的Scala样例类

完全对齐JSON的层级结构定义:

// 最内层结构
case class LineOfBusinessDetail(enterpriseCode: String, description: String)
case class MacAddressListing(name: String, macAddress: String)
case class Equipment(
  model: String,
  equipmentType: String,
  deviceCapabilities: List[String],
  CustomerOwned: String,
  serialNumber: String,
  lineOfBusinessDetail: List[LineOfBusinessDetail],
  macAddressListings: List[MacAddressListing],
  make: String,
  currentLocationEntryDate: String
)
// 中层结构
case class ServiceDeviceAssignments(equipment: List[Equipment])
case class DomainEntityMetadata(
  messageTimestamp: String,
  modifiedTimestamp: String,
  sourceSystem: String,
  keyPath: List[String],
  jsvCompatibility: List[String],
  domainEntityName: String
)
// 最外层结构
case class AccountEquipment(
  fqAccountId: String,
  domainEntityMetadata: DomainEntityMetadata,
  soloAccountId: String,
  serviceDeviceAssignments: ServiceDeviceAssignments
)

3. 解析JSON、读取字段并打印输出

import io.circe._
import io.circe.generic.auto._
import io.circe.parser._

object JsonParseDemo extends App {
  // 待解析的JSON字符串
  val jsonStr =
    """
      |{
      |  "fqAccountId": "DUMMY.8351/8351200212366540",
      |  "domainEntityMetadata": {
      |    "messageTimestamp": "2021-05-12T03:15:01.335Z",
      |    "modifiedTimestamp": "2021-04-22T14:10:08.741Z",
      |    "sourceSystem": "",
      |    "keyPath": [
      |      "fqAccountId"
      |    ],
      |    "jsvCompatibility": [
      |      "1.0.0"
      |    ],
      |    "domainEntityName": "equipment"
      |  },
      |  "soloAccountId": "XXXXXXXXXXXXX",
      |  "serviceDeviceAssignments": {
      |    "equipment": [
      |      {
      |        "model": "ES2251",
      |        "equipmentType": "MTA",
      |        "deviceCapabilities": [],
      |        "CustomerOwned": "R",
      |        "serialNumber": "7C8FDEF58D10",
      |        "lineOfBusinessDetail": [
      |          {
      |            "enterpriseCode": "HSD",
      |            "description": "HSD"
      |          }
      |        ],
      |        "macAddressListings": [
      |          {
      |            "name": "CM",
      |            "macAddress": "56444"
      |          }
      |        ],
      |        "make": "SERCO",
      |        "currentLocationEntryDate": "2021-04-22T14:10:08.741Z"
      |      }
      |    ]
      |  }
      |}
      |""".stripMargin

  // 执行JSON解析
  val parseResult = parse(jsonStr).flatMap(_.as[AccountEquipment])

  parseResult match {
    case Right(accountEquipment) =>
      // 读取并打印顶层字段
      println(s"账号FQ ID: ${accountEquipment.fqAccountId}")
      println(s"独立账号ID: ${accountEquipment.soloAccountId}")
      // 读取并打印元数据字段
      val metadata = accountEquipment.domainEntityMetadata
      println(s"领域实体名: ${metadata.domainEntityName}")
      println(s"消息时间戳: ${metadata.messageTimestamp}")
      // 读取并打印设备信息
      val equipments = accountEquipment.serviceDeviceAssignments.equipment
      equipments.zipWithIndex.foreach { case (eq, idx) =>
        println(s"===== 第${idx+1}台设备信息 =====")
        println(s"设备型号: ${eq.model}")
        println(s"设备类型: ${eq.equipmentType}")
        println(s"序列号: ${eq.serialNumber}")
        println(s"厂商: ${eq.make}")
        println(s"是否客户自有: ${eq.CustomerOwned}")
        // 打印MAC地址信息
        eq.macAddressListings.foreach(mac => println(s"${mac.name} MAC地址: ${mac.macAddress}"))
        // 打印业务线信息
        eq.lineOfBusinessDetail.foreach(lob => println(s"业务线: ${lob.enterpriseCode} - ${lob.description}"))
      }
    case Left(error) =>
      println(s"JSON解析失败: ${error.getMessage}")
  }
}

运行输出示例

账号FQ ID: DUMMY.8351/8351200212366540
独立账号ID: XXXXXXXXXXXXX
领域实体名: equipment
消息时间戳: 2021-05-12T03:15:01.335Z
===== 第1台设备信息 =====
设备型号: ES2251
设备类型: MTA
序列号: 7C8FDEF58D10
厂商: SERCO
是否客户自有: R
CM MAC地址: 56444
业务线: HSD - HSD

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:54:04