2014-01-21 3 views
3

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

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^