2014-01-21 43 views
3

为了向后兼容的原因,我正在编写一个库来转换来自API的JSON响应。我需要做的是采取任意的JSON,并改变某些字段名称。我正在使用scala和argonaut,但我没有看到文档中的任何方式或更改FIELD名称的示例,只有值。在argonaut中转换JSON字段名称

回答

0

我最终折叠了需要转换并添加到地图的对象,然后创建了一个新的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: _* 
) 
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}}})

+0

因此,如果我正确地阅读,它看起来像我必须事先知道JSOn的结构,我不一定。我只想重命名“a”到“b”(大致)的任何字段。我想出了一个解决方案,但同样不好。 – Falmarri