Scala如何操作动态字段JSON对象实现格式映射转换
Scala动态JSON转换方案
针对顶级字段名动态的JSON转换需求,Scala生态的主流JSON处理库都可以原生支持,不需要提前定义所有字段名,以下是具体实现方案:
核心实现逻辑
所有方案的核心逻辑统一为3步:
- 将输入JSON字符串解析为库内置的无固定Schema JSON对象类型,不绑定预定义的case class
- 遍历JSON对象的所有顶级键值对,保留原键名,从对应的值对象中提取
value字段的内容作为新值,可根据业务需要过滤无value字段的无效项 - 处理完成后将新的键值对组装为目标JSON对象,按需序列化输出
方案1:使用Circe库实现
Circe是当前Scala生态中广泛使用的纯函数式JSON处理库,实现代码如下:
import io.circe._ import io.circe.parser._ // 你的输入JSON字符串,注意原示例JSON中"value"后缺少冒号,实际使用请保证输入格式合法 val rawInputJson = """ { "field1": { "value": "some value 1", "description": "some test description" }, "field2": { "value": "some value 2", "description": "some test description" } } """ val convertResult = for { parsedJson <- parse(rawInputJson) jsonObject <- parsedJson.as[JsonObject] // 遍历所有字段,提取value字段内容,自动过滤无value的无效字段 processedFields = jsonObject.toList.flatMap { case (fieldKey, fieldValue) => fieldValue.hcursor.get[String]("value").toOption.map(fieldKey -> _) } outputJson = Json.fromFields(processedFields) } yield outputJson // 输出转换后的JSON字符串 println(convertResult.map(_.noSpacesSortKeys))
方案2:使用Play JSON库实现
Play JSON是Play框架自带的JSON处理库,在大量Scala服务中广泛应用,实现代码如下:
import play.api.libs.json._ val rawInputJson = """ { "field1": { "value": "some value 1", "description": "some test description" }, "field2": { "value": "some value 2", "description": "some test description" } } """ val parsedJson = Json.parse(rawInputJson).as[JsObject] // 遍历处理所有字段 val processedFields = parsedJson.fields.flatMap { case (fieldKey, fieldValue) => (fieldValue \ "value").asOpt[String].map(fieldKey -> JsString(_)) } val outputJson = JsObject(processedFields) // 输出格式化后的转换结果 println(Json.prettyPrint(outputJson))
边界情况处理
如果业务需要保留没有value字段的键,可以将上述代码中的flatMap替换为map,同时给缺失的value设置默认值即可,示例如下(以Circe为例):
val processedFields = jsonObject.toList.map { case (fieldKey, fieldValue) => fieldKey -> fieldValue.hcursor.get[String]("value").getOrElse("默认值") }
内容的提问来源于stack exchange,提问作者José Silva
相关产品推荐
相关产品推荐

