Преобразование имен полей JSON в аргонавте
Я пишу библиотеку для преобразования ответов JSON из API по причинам обратной совместимости. И что мне нужно сделать, это взять произвольный JSON и изменить определенные имена полей. Я использую scala и argonaut, но я не вижу никакого способа в документах или примерах изменения имен полей, только значения.
2 ответа
Решение
В итоге я свернул объект, который мне нужно преобразовать, и добавил на карту, а затем создал новый объект 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: _*
)
Я не знаю особенно хорошего способа сделать это, но это не слишком ужасно, чтобы написать помощник, который заменит поле в объекте, а затем использовать его в курсоре с 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}}})
как и ожидалось.