我正在嘗試讀取一些 DynamoDb 資料并使用 spark/scala 更新它們。我正在像這樣讀取 Json 中的資料:
{
"2021-11-24": {
"Execution_Steps": {
"Step_1": "OK",
"Step_2": "RUNNING"
},
"status": "RUNNING",
"start_date": "2021-11-25 00:00:00"
},
"2021-11-20": {
"end_date": "2021-11-25 01:00:00",
"status": "OK",
"start_date": "2021-11-25 00:00:00"
}
}
使用 jackson 我可以將其序列化為 Maps
val dataMap = mapper.readValue(jsonData, classOf[Map[String, String]])
所以我得到了這張地圖: Map(2021-11-20 -> Map(end_date -> 2021-11-25 01:00:00, status -> OK, start_date -> 2021-11-25 00:00:00) , 2021-11-24 -> Map(Execution_Steps -> Map(Step_2-> RUNNING, Step_1-> OK), status -> RUNNING, start_date -> 2021-11-25 00:00:00))
如何將地圖更新"2021-11-24"."Execution_Steps"."Step_2"為 OK 而不是 Running?
謝謝!
uj5u.com熱心網友回復:
假設你的起點:
import com.fasterxml.jackson.databind.{JsonNode, ObjectMapper}
import com.fasterxml.jackson.databind.node.ObjectNode
val json = "{\n \"2021-11-24\": {\n \"Execution_Steps\": {\n \"Step_1\": \"OK\",\n \"Step_2\": \"RUNNING\"\n },\n \"status\": \"RUNNING\",\n \"start_date\": \"2021-11-25 00:00:00\"\n },\n \"2021-11-20\": {\n \"end_date\": \"2021-11-25 01:00:00\",\n \"status\": \"OK\",\n \"start_date\": \"2021-11-25 00:00:00\"\n }\n}"
您可以JsonNode直接使用 并Map[String,String]作為最后一步進入
val objectMapper = new ObjectMapper()
val jsonNode = objectMapper.readTree(json)
def update(objectNode: JsonNode): JsonNode = {
jsonNode
.get("2021-11-24")
.get("Execution_Steps")
.asInstanceOf[ObjectNode]
.put("Step_2", "OK")
objectNode
}
val updated =
update(jsonNode)
objectMapper
.treeToValue(updated, classOf[java.util.Map[String,String]])
注意:get可能回傳空值。也許用Option?
這個 API 與 Scala 的不變性哲學并不相配。
uj5u.com熱心網友回復:
我在gatear的幫助下解決了這個問題,而不是像這樣讀取資料:
val dataMap = mapper.readValue(jsonData, classOf[Map[String, String]])
我在 ObjectNode 中讀到:
val dataMap = mapper.readTree(jsonData).asInstanceOf[ObjectNode]
然后我可以使用以下命令進行更新:
dataMap.get("2021-11-24").asInstanceOf[ObjectNode].get("Execution_Steps").asInstanceOf[ObjectNode].put("Step_2", "OK")
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/370539.html
