6

私が使用している REST サービスから返されたこの JSON があります。

{
    "id": "6804",
    "signatories": [
        {
            "id": "12125",
            "fields": [
                {
                    "type": "standard",
                    "name": "fstname",
                    "value": "John"
                },
                {
                    "type": "standard",
                    "name": "sndname",
                    "value": "Doe"
                },
                {
                    "type": "standard",
                    "name": "email",
                    "value": "john.doe@somwhere.com"
                },
                {
                    "type": "standard",
                    "name": "sigco",
                    "value": "Company"
                }
            ]
        }
    ]
}

現在、これをjson4sで解析し、「フィールド」配列を反復して、そこにあるさまざまなオブジェクトのプロパティ「値」を変更できるようにする方法を検討しています。これまでのところ、いくつかのjsonライブラリを試してみましたが、最終的にはjson4sになりました。

Json4s を使用すると、json を解析して JObject にすることができます。この JObject から、"fields" 配列を抽出してみることができます。

    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)))

このように Map を抽出し、再度 JSON にレンダリングしました。私が理解できないのは、これらのフィールドをループしてプロパティの「値」を変更する方法です。

私はjson4sのドキュメントを読みましたが、Scalaとその構文の両方に非常に慣れていないため、苦労しています。

問題は、解析された JSON の結果を反復処理して、プロパティの「値」を変更するにはどうすればよいかということです。

これが私が達成したい流れです。

  1. JSON を解析して反復可能なオブジェクトにする
  2. ループして特定の「名前」を探し、それらの値 (たとえば fstname) を John から別の名前に変更します。
  3. それを解析して JSON に戻すので、更新された値を含む新しい JSON を送り返すことができます。

これがこれを行うための最良の方法であるかどうかはわかりません。入力をいただければ幸いです。おそらくこれを行うより簡単な方法があります。

よろしくお願いします。

ステファン・コンノ

4

1 に答える 1

6

json を case クラスの配列に変換できます。これが最も簡単な方法です。例:次のようなフィールドのケースクラスを持つことができます

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

read[Array[Field]](json)json がどこにあるかのようなフィールドの配列に json を変換できます

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

これにより、フィールドの配列が得られます。同様に、Json 全体をモデル化できます。

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

その後、オブジェクトの配列を Json に変換するには、単純に使用できます write(objects)(Json4s の読み取りおよび書き込み関数はorg.json4s.native.Serializationパッケージで利用できます。

Update 

ケースクラスに変換せずに行うには、 transformField 関数を使用できます

parse(json).transformField{case JField(x, v) if x == "value" && v == JString("Company")=> JField("value1",JString("Company1"))}
于 2015-01-13T13:59:02.503 に答える