如何基于复杂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
相关产品推荐
相关产品推荐

