2015-01-13 51 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轉換成田陣列像read[Array[Field]](json)其中JSON是

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

,這將給你字段的數組。同樣,你可以爲你的整個Json建模。

就像現在你有一個case類的數組一樣,迭代對象並使用case類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"))} 
+0

好吧,我會試試看。我的計劃首先是使用Case Class來轉換我的json。我粘貼的json只是我從REST接收到的json的一部分,所以我無法爲50個字段創建一個case類。這就是爲什麼我決定用json4s解析json。我可以在不創建案例類的情況下執行此操 –

+0

我不確定。然而,在一段時間後,我會嘗試使用IMO,最好使用case類的組合來構建一個更大的case類,然後使用像結構這樣的大地圖,而Json4s使得將json轉換爲嵌套case類非常容易。 – mohit

+0

更新了答案 – mohit