2014-01-21 60 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