4

出于向后兼容性的原因,我正在编写一个库来转换来自 API 的 JSON 响应。我需要做的是接受任意 JSON,并更改某些字段名称。我正在使用 scala 和 argonaut,但我在文档或更改字段名称的示例中看不到任何方法,只有值。

4

2 回答 2

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: _*
)
于 2014-01-21T20:41:14.887 回答
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}}})预期返回。

于 2014-01-21T19:10:47.583 回答