Как заменить часть дерева JSON в структуре лифта - PullRequest
4 голосов
/ 23 июня 2011

Мне нужно заменить ветвь дерева JSON с помощью платформы лифта (v2.3).Например, я хотел бы заменить ветку «a3» новым деревом

{
    'a': {
      'a1': {
            'a3': . . . 
        }
    }
}

В настоящее время я использую JValue и думаю, что могу сделать замену с помощью метода сгиба рекурсивно, но это кажется многословнымесли мне нужно заменить ветку глубиной в несколько уровней.

Есть ли лучший способ сделать это?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 24 июня 2011

Никто не ответил, и я нашел подходящее решение, которым можно поделиться:

import net.liftweb.json.JsonParser._
import net.liftweb.json.JsonAST._
import net.liftweb.json.Printer._

// change any a3 fields at any depth of the tree
compact(render(a.transform {
    case JField("a3", _) => JString("changed")
}))

// String = {"a":{"a1":{"a3":"changed"}}}

// will only change a.a1.a3
compact(render(a.transform {
    case JField("a", lvl2) =>  lvl2 transform {
        case JField("a1", lvl3) => lvl3 transform {
            case JField("a3", _) => JString("changed")
        }
    }
}))
// String = {"a":{"a1":{"a3":"changed"}}}
1 голос
/ 14 января 2013

В классе JValue типа lift-json есть метод замены.

val data = ...
val replacement = ...

val newData = data.replace("a" :: "a1" :: "a3" :: Nil, replacement)
...