我使用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"
}
答案 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
,因为我们可以将String
或Map
作为值)转换为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字符串写一个文件的示例。文件名为JsObjects
,0.json
等。
1.json