2011-06-23 6 views
4

リフトフレームワーク(v2.3)を使用してjsonツリーのブランチを置き換える必要があります。例えば、私は現在、JValueを使用して、私は再帰的に折り畳み方法を使用して、交換を行うことができると思うが、私ならば、それは冗長に思えるのです新しいツリーリフトフレームワークのjsonサブツリーの一部を置き換えるには

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

で「A3」の枝を交換したいのですがいくつかのレベルの深いブランチを交換する必要があります。

これを行うより良い方法はありますか?

ありがとうございました。

答えて

2

誰も答えていて、私が共有するためにまともな解決策を見つけた:

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

リフトJSON JValueクラスが代わる方法があります。

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

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