如何在Scala中从JSON生成合并值列表并按条件拆分输出?
Scala实现指定JSON数据处理需求
输入JSON
[{ "Orders": { "orderid": { "path": "order_id", "type": "CHAR", "is_explode_required": "N" }, "customerId": { "path": "customers.customerId", "type": "CHAR", "is_explode_required": "N" }, "offerid": { "path": "Offers.Offerid", "type": "LIST", "is_explode_required": "Y" } }, "products": { "productid": { "path": "product_id", "type": "CHAR", "is_explode_required": "N" }, "productName": { "path": "products.productname", "type": "CHAR", "is_explode_required": "N" } } }]
需求说明
处理上述JSON中的Orders节点,生成两列结果:
- output:拼接
Orders下所有子节点的path值,用逗号分隔 - explode_output:仅拼接
Orders下is_explode_required属性为"Y"的子节点的path值
Scala实现代码(基于Play JSON库)
import play.api.libs.json._ object JsonProcessor extends App { // 输入JSON字符串 val inputJson = """[{ "Orders": { "orderid": { "path": "order_id", "type": "CHAR", "is_explode_required": "N" }, "customerId": { "path": "customers.customerId", "type": "CHAR", "is_explode_required": "N" }, "offerid": { "path": "Offers.Offerid", "type": "LIST", "is_explode_required": "Y" } }, "products": { "productid": { "path": "product_id", "type": "CHAR", "is_explode_required": "N" }, "productName": { "path": "products.productname", "type": "CHAR", "is_explode_required": "N" } } }]""" // 解析JSON val parsedJson = Json.parse(inputJson) // 提取Orders节点下的所有子对象 val ordersChildren = (parsedJson(0) \ "Orders").as[JsObject].values // 生成output列:所有path值拼接 val outputCol = ordersChildren.map(_.as[JsObject]("path").as[String]).mkString(",") // 生成explode_output列:筛选符合条件的path值拼接 val explodeOutputCol = ordersChildren .filter(child => (child \ "is_explode_required").as[String] == "Y") .map(_.as[JsObject]("path").as[String]) .mkString(",") // 打印结果 println("output| explode_output") println(s"$outputCol|$explodeOutputCol") }
依赖配置
如果使用Play JSON,需要在build.sbt中添加以下依赖:
libraryDependencies += "com.typesafe.play" %% "play-json" % "2.9.2"
预期输出
output| explode_output order_id,customers.customerId,Offers.Offerid|Offers.Offerid
内容的提问来源于stack exchange,提问作者Shankar Panda
相关产品推荐
相关产品推荐

