出于向后兼容性原因,我正在编写一个库来转换来自API的JSON响应。我需要做的是接受任意JSON,并更改某些字段名称。我正在使用scala和argonaut,但我没有看到更改FIELD名称的文档或示例中的任何方法,只有值。
答案 0 :(得分:1)
我不知道有什么特别好的方法可以做到这一点,但是编写一个帮助器来替换对象中的字段然后在带有withObject
的游标中使用它并不是太糟糕了:
def renameField(before: JsonField, after: JsonField)(obj: JsonObject) =
obj(before).map(v => (obj - before) + (after, v)).getOrElse(obj)
Parse.parseOption("""{ "a": { "b": { "c": 1 } } }""").flatMap { json =>
(json.hcursor --\ "a").withFocus(_.withObject(renameField("b", "z"))).undo
}
这将按预期返回Some({"a":{"z":{"c":1}}})
。
答案 1 :(得分:1)
我最终折叠了我需要转换并添加到地图的对象,然后创建了一个新的json对象。
val conversionMap = Map("a" -> "b")
Json(
j.objectOrEmpty.toMap.foldLeft(Map.empty[JsonField, Json]) {
case (acc, (key, value)) =>
acc.updated(conversionMap.getOrElse(key, key), j.fieldOrNull(key))
}.toSeq: _*
)