修改地图列表中的json值并保存输出

时间:2018-04-25 10:14:54

标签: json scala playframework

我使用play框架阅读了以下示例json。

{
  "field_a": "dummy",
  "field_b": "dummy",
  "nest": {
    "nest_a": "dummy",
    "nest_b": 87
  },
  "field_c": null,
  "field_d": null,
  "field_e": "chocolate",
  "field_f": "sugar",
  "array": [
    "dummy entry"
  ],
  "id": "Anything"
}

我接下来要使用以下输入替换数据的以下地图列表:

val substitutionsList: List[mutable.Map[String, String]] = List(
    mutable.Map("field_b" -> "dummy string", "field_d" -> "2016-01-01", "field_f" -> "2011-01-01"),
    mutable.Map("field_b" -> "dummy string", "field_d" -> "2018-01-01", "field_f" -> "2018-01-01"),
    mutable.Map("field_b" -> "dummy string", "field_d" -> "2018-04-01", "field_f" -> "2018-04-01"),
    mutable.Map("field_b" -> "dummy string", "field_d" -> "2016-01-01", "field_f" -> "2016-01-01")
)

我正在json中阅读如下:

def parseSchemaJson(schemaContent: String) = Json.parse(schemaContent).as[JsObject]
val baseSchemaInput = parseSchemaJson(Source.fromFile("/dummy.json").mkString)

我想迭代我的输入并将json中的值替换为我的地图中的值,并在每个完成后,创建一个新的.json文件。

private def replaceField(json: JsObject, fieldToReplace: String): Option[String] = (json \ fieldToReplace).asOpt[String]
println(replaceField(baseSchemaInput, "field_a")) //prints dummy

我可以使用类似的东西列出我的json中的值,但我不知道如何将列表中的值交换到每个相应的位并写出一个json文件。

首次出现预期产出

{
  "field_a": "dummy",
  "field_b": "dummy string",
  "nest": {
    "nest_a": "dummy",
    "nest_b": 87
  },
  "field_c": null,
  "field_d": "2016-01-01",
  "field_e": "chocolate",
  "field_f": "2011-01-01",
  "array": [
    "dummy entry"
  ],
  "id": "Anything"
}

1 个答案:

答案 0 :(得分:1)

给出以下替换列表:

val substitutionsList: List[mutable.Map[String, Any]] = List(
  mutable.Map("field_b" -> "dummy string 1", "field_d" -> "2016-01-01", "field_f" -> "2011-01-01"),
  mutable.Map("field_b" -> "dummy string 2", "nest" -> mutable.Map("nest_b" -> "90"))
)

请注意,第二个更新嵌套值。您需要创建嵌套的Map来定义嵌套值。

您可以定义一个函数来转换Map[String, Any]Any,因为我们可以将StringMap作为值)转换为JsObject 。这是一个递归函数,如果值为Map

,它将调用自身
def mapToJsObject(map: mutable.Map[String, Any]): JsObject =
  JsObject(map.mapValues {
    case v:String => JsString(v)
    case v:mutable.Map[String, mutable.Map[String, Any]] => mapToJsObject(v.asInstanceOf[mutable.Map[String, Any]])
  })

然后浏览您的替换列表,并使用JsObject上定义的Map函数深入合并每个JsObject的{​​{1}}与原始deepMerge }类。它也将合并嵌套对象。 See API here

JsObject

这应该会为您提供val substitutedJsObjects: List[JsObject] = substitutionsList .map(mapToJsObject) .map(baseSchemaInput.deepMerge) 的列表,列表中每个地图一个

然后您可以将它们写入文件。这是一个为每个json字符串写一个文件的示例。文件名为JsObjects0.json等。

1.json