2014-09-29 68 views
0

我具有以下JSON(myJson)替換使用SCALA玩

{ 
    "responseHeader":{ }, 
    "response":{ 
     "numFound":5, 
     "start":0, 
     "docs":[ 
     { 
      "product_id":"11", 
     }, 
     { 
      "product_id":"12", 
     }, 
     { 
      "product_id":"13", 
     }, 
     { 
      "product_id":"14", 
     }, 
     { 
      "product_id":"15", 
     }, 
     ] 
    }, 
} 

和productToRemove嵌套JSON響應:設置[字符串] =(11,14)

我想過濾我的JSON和刪除所有產品的ID是存在於集

所以我在我的()函數沒有

def function(myJson, productToRemove) : numFound = { 
    val docs: List[JsObject] = (myJson \ "response" \ "docs").as[List[JsObject]] 
    val newDocs: List[JsObject] = docs.filter(e => (productToRemove.contains((e \ "product_id").as[String]))) 
} 

我想返回newJson更新numFound和文檔,以便結果將是

{ 
    "responseHeader":{ }, 
    "response":{ 
     "numFound":3, 
     "start":0, 
     "docs":[ 
     { 
      "product_id":"12", 
     }, 
     { 
      "product_id":"13", 
     }, 
     { 
      "product_id":"15", 
     }, 
     ] 
    }, 
} 

如何更新此json?

+0

響應看起來像Solr的響應。如果是這樣,考慮更新查詢來過濾這些(這會給你其他好處,如分頁,分面等)。 – roterl 2014-09-30 05:51:33

回答

0

如下你可以這樣做:

def function(myJson: JsValue, productToRemove:List[String]) = { 
    val docs: List[JsObject] = (myJson \ "response" \ "docs").as[List[JsObject]] 

    // Use filterNot to remove. 
    val newDocs: List[JsObject] = docs.filterNot(e => (productToRemove.contains((e \ "product_id").as[String]))) 

    // extract old response. 
    val originalResponse = (myJson \ "response").as[JsObject] 

    // update "docs" in old response. 
    val newResponse = originalResponse ++ Json.obj("docs" -> newDocs) 

    // update "response" in myJson 
    myJson.as[JsObject] ++ Json.obj("response" -> newResponse) 
} 
3

您可以使用文檔中描述的Json transformers。在這裏你去:

val productJsonTransformer = (__ \ 'response \ 'docs).json.update(
    __.read[JsValue].map { o => 
    val elems = 
     o.as[List[JsObject]].filter { x => 
     val y = x \ "product_id" 
     ! productToRemove.contains(y.as[String].toInt) 
     } 
    Json.toJson(elems) 
    }) 

println(Json.prettyPrint(json.transform(productJsonTransformer).get)) 

輸出:

{ 
    "responseHeader" : { }, 
    "response" : { 
    "numFound" : 5, 
    "start" : 0, 
    "docs" : [ { 
     "product_id" : "12" 
    }, { 
     "product_id" : "13" 
    }, { 
     "product_id" : "15" 
    } ] 
    } 
} 
+0

我們還需要更新numFound以及 – user1661010 2014-09-29 11:46:56

+0

您可以創建另一個變壓器並將該變壓器應用到第一個變壓器返回的結果。 – tuxdna 2014-09-29 12:08:18