2015-01-13 16 views
6

私が使用しているRESTサービスから返されたこのJSONがあります。 Scalaのjsonの解析と操作

{ 
    "id": "6804", 
    "signatories": [ 
     { 
      "id": "12125", 
      "fields": [ 
       { 
        "type": "standard", 
        "name": "fstname", 
        "value": "John" 
       }, 
       { 
        "type": "standard", 
        "name": "sndname", 
        "value": "Doe" 
       }, 
       { 
        "type": "standard", 
        "name": "email", 
        "value": "[email protected]" 
       }, 
       { 
        "type": "standard", 
        "name": "sigco", 
        "value": "Company" 
       } 
      ] 
     } 
    ] 
} 

は現在、私はそこに別のオブジェクトのプロパティ「値」を変更できるように、「フィールド」列を反復処理、json4sでこれを解析する方法に探しています。これまで私はいくつかのjsonライブラリを試して、 json4sで終わった。

Json4sはjsonをJObjectに解析することを許可しています。これは「フィールド」配列 の抽出を試みることができます。

import org.json4s._ 
    import org.json4s.native.JsonMethods._ 

    // parse to JObject 
    val data = parse(json) 

    // extract the fields into a map 
    val fields = data \ "signatories" \ "fields" 

    // parse back to JSON 
    println(compact(render(fields))) 

私はこのような地図を抽出するために管理し、再びJSONに戻ってそれをレンダリングしてきました。私は理解できませんが、どのようにこれらのフィールドをループし、それらのプロパティ "値"を変更するのですか?

私はjson4sのドキュメントを読んだことがありますが、私はScalaと構文の両方にとって非常に新しいので、私は難しい時を過しています。

質問は、「値」プロパティを変更するために、解析されたJSON結果をどのように反復処理するのですか?

ここでは達成したいフローがあります。

  1. 解析JSON反復可能なオブジェクト
  2. ループに通し、特定の「名前」を探し、ジョンからいくつかの他の名前に、例えばfstnameのために、彼らの値を変更します。
  3. これをJSONに戻して解析します。更新された値を新しいJSONに戻すことができます。

これを行うにはこれが最善の方法かどうかわかりません。私は本当に入力していただければ幸いです。これを行う簡単な方法があります。事前に

おかげで、 敬具、

ステファン・今野

+0

質問は何を使用することができますか? – Theolodis

+0

"どのようにこれらのフィールドをループし、それらのプロパティ"値 "を変更するのですか?"私は質問をよりよく訳すために、質問を編集します、申し訳ありません。 –

+0

オブジェクトを逆シリアル化せずに\\演算子を使用することはいつでも可能です。 – bkowalikpl

答えて

6

あなたは一番簡単な方法であるケースクラスの配列にJSONに変換することができます。たとえば:あなたは

case class Field(`type`: String, name: String, value: String) 

などの分野のためのケースクラスを持つことができますし、JSONはあなたにフィールドの配列を与える

[ 
      { 
       "type": "standard", 
       "name": "fstname", 
       "value": "John" 
      }, 
      ... 
     ] 

あるread[Array[Field]](json)のようなフィールドの配列にあなたのJSONに変換することができます。同様に、あなたはJson全体をモデル化することができます。

これで、ケースクラスの配列が得られました。オブジェクトを反復し、ケースクラスcopyメソッドを使用して値を変更するのは非常に簡単です。

その後、オブジェクトの配列をJsonに変換するには、write(objects)を使用するだけです(Json4の読み書き機能はorg.json4s.native.Serializationパッケージにあります)。

Update 

ケースクラスに変換することなく、それを行うには、transformField機能

parse(json).transformField{case JField(x, v) if x == "value" && v == JString("Company")=> JField("value1",JString("Company1"))} 
+0

いいです、私はそれを試してみましょう。私の計画はまずケースクラスを使ってjsonを変換することでした。私が貼り付けたjsonは、RESTから受け取ったjsonの一部に過ぎないので、50個のフィールドのようなケースクラスは作成できませんでした。だから私はjson4sでjsonを解析することに決めました。ケースクラスを作成せずにこれを行うことはできますか? –

+0

わかりません。私はしばらくしてから試してみますが、IMOでは、大文字と小文字のクラスを組み合わせて構造体のような大きなマップを作成し、Json4sを使ってjsonをネストされたケースクラスに変換するのが簡単になります。 – mohit

+0

答えを更新しました – mohit