如何加载 json 文件的特定键并使用该键下的值列表创建字符串?

问题描述 投票:0回答:1

我正在解析一个主 json,其中包含 scala 中的完整数据。然后我需要加载另一个 json,它具有用于过滤每个对象的必需属性,例如 Orders 就是其中之一。我需要读取所有值而不对任何键进行硬编码。然后我需要以这种方式为订单对象“order_id,customers.customerId”创建一个字符串。你能帮我创建这个字符串吗

{
    "Orders": {
        "orderid": "order_id",
        "customerId": "customers.customerId"
    },
    "Products": {
        "productid": "product_id",
        "productName": "products.productName"
    }
}

你能用 scala 帮我吗?

scala apache-spark
1个回答
0
投票

我使用了maven包

play-json
version: 2.7.4, scala: 2.13
)来实现以下结果。在高层次上,解析 JSON 字符串 -> 将字符串转换为每个 kv 对的映射 -> 使用
foldLeft

生成感兴趣的字符串
import play.api.libs.json._

val jsonString = """
{
    "Orders": {
        "orderid": "order_id",
        "customerId": "customers.customerId"
    },
    "Products": {
        "productid": "product_id",
        "productName": "products.productName"
    }
}
"""



def returnKeysOfInterest(jsonString: String, keyName: String): String = {
  val json: JsValue = Json.parse(jsonString)
  val map: Map[String, JsValue] = json.as[Map[String, JsValue]]
  val keysMap: Map[String, String] = map(keyName).as[Map[String, String]]

  val keysString: String = keysMap.values.foldLeft("")((a, b) => if (a.isEmpty) b else a + "," + b)

  keysString
}

returnKeysOfInterest(jsonString, "Orders") // order_id,customers.customerId

在这里,我假设 kv 对具有一层嵌套,正如您共享的输入所建议的那样。如果有更多级别的嵌套,那么我们可以相应地修改

keysString
变量。

© www.soinside.com 2019 - 2024. All rights reserved.