簡體   English   中英

使用 scala 更新 Map[String, Map] 中的值

[英]Updating a Value inside a Map[String, Map] with scala

我正在嘗試讀取一些 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: 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))

如何將 Map "2021-11-24"."Execution_Steps"."Step_2"更新為 OK 而不是 Running?

謝謝!

我在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")

好吧,假設您的起點:

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並將 go 放入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可能返回 null。 也許使用Option

這個 API 並不真正符合 Scala 的不變性哲學。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM