Преобразование имен полей JSON в argonaut

Я пишу библиотеку для преобразования ответов JSON из API по причинам обратной совместимости. И что мне нужно сделать, это взять произвольный JSON и изменить имена определенных полей. Я использую scala и argonaut, но я не вижу в документах или примерах изменения имен FIELD, только значения.


person Falmarri    schedule 21.01.2014    source источник


Ответы (2)


Я не знаю особенно хорошего способа сделать это, но не так уж ужасно написать помощник, который заменит поле в объекте, а затем использует его в курсоре с 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}}}), как и ожидалось.

person Travis Brown    schedule 21.01.2014
comment
Так что, если я правильно это понимаю, похоже, мне нужно заранее знать структуру JSOn, что мне не обязательно. Я просто хочу переименовать любые поля с именем a в b (примерно). Я придумал решение, но оно столь же нехорошее. - person Falmarri; 22.01.2014

В итоге я свернул объект, который мне нужно преобразовать, и добавил его на карту, а затем создал новый объект 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: _*
)
person Falmarri    schedule 21.01.2014