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