2017-02-01 4 views
1

Ich möchte ein Top-Level-Feld namens "ID" in einer JSON-Struktur entfernen, ohne alle Felder namens "ID", was passiert, wenn ich laufe Mit dem folgenden Code:Top-Level-Feld in Json4s entfernen, wenn verschachteltes Feld mit ähnlichen Namen existiert

scala> import org.json4s._ 
import org.json4s._ 

scala> import org.json4s.native.JsonMethods._ 
import org.json4s.native.JsonMethods._ 

scala> import org.json4s.JsonDSL._ 
import org.json4s.JsonDSL._ 

scala> val json = parse("""{ "id": "bep", "foo": { "id" : "bap" } }""") 
json: org.json4s.JValue = JObject(List((id,JString(bep)), (foo,JObject(List((id,JString(bap))))))) 

scala> json removeField { 
    | case ("id", v) => true 
    | case _ => false 
    | } 
res0: org.json4s.JValue = JObject(List((foo,JObject(List())))) 

Jede Idee, wie ich vermeiden, kann das innere „id“ -Feld zu entfernen?

Edit: leider habe ich nicht die Fähigkeit, die alle möglichen Top-Level zur Liste haben Objekte die json enthält oder enthalten.

+0

Nun, könnte man diesen Ansatz hier und wählen Sie alle ID-Felder, die nicht die ersten sind, so dass sie gleich bleiben: http://stackoverflow.com/questions/14216069/scala-remove-field-from-json -Dateien-in-the-nested-Objekt-mit definierten-namen – nmat

+0

@nmat nicht sicher, ob ich folgen? In dieser Antwort geht es darum, ein verschachteltes Feld zu entfernen, ohne die äußeren Felder zu berühren, was in Ordnung ist. Ich möchte ein Feld der obersten Ebene entfernen, ohne andere, möglicherweise verschachtelte Felder zu berühren. – burk

Antwort

0

Basierend auf der Antwort here Sie so etwas tun könnte:

val transformedJson2 = json transform { 
    case JField("id", _) => JNothing 
    case JField("foo", fields) => fields 
} 

Es ist definitiv nicht ideal, weil Sie alle foo Elemente mit einem Unterelement dieses id

+0

Ok, ich verstehe. Danke für die Antwort. Die Eingabe json ist jedoch dynamisch und ich kann nicht alle Felder kontrollieren, die sie enthält. – burk

0

angeben würde zu tun haben, ohne die Notwendigkeit, das Schema von anderen Bereichen zu wissen:

JObject(
    json.asInstanceOf[JObject].obj.filterNot(_._1 == "id") 
) 

JObject() obj ist die flache Liste. von Feldern, die das Objekt bilden.

Dies scheint nicht möglich, obwohl im json4s DSL bleiben.

Verwandte Themen