2017-04-26 2 views
0

Spielen Ich habe den folgenden CodeDie Unterscheidung zwischen verschiedenen Arten von JsValues ​​- Scala

val json : JsValue = Json.parse(jsonMap) 
val jsonObj : JsObject = json.as[JsObject] 

Mit jsonObj.fields Ich bin in der Lage key, value Paare in Form von String, JsValue zu bekommen. Mein JSON ist verschachtelt. Beispiel ist unten:

{ 
    "name": "answer", 
    "plural": "answers", 
    "base": "PersistedModel", 
    "idInjection": true, 
    "options": { 
    "validateUpsert": true 
    }, 
    "properties": { 
    "sender": { 
     "type": "string", 
     "required": true, 
     "default": "ASK" 
    }, 
    "read": { 
     "type": "boolean", 
     "required": true, 
     "default": false 
    } 
    } 
} 

Wie Sie sehen können, einige Felder, wie name nur einen einzigen Wert, während andere, wie properties und options in ihnen ein anderes json Objekt haben. Ich wollte wissen, ob es einen Weg zwischen den beiden JsValues, wo man zu unterscheiden ist eine eindeutig ein string und eine andere ist nicht von play.api.libs.json._

Mit value.isInstanceOf[JsValue] Verwendung nicht als JsObject kehrt als JsValue beide Fälle funktioniert.

Jede Hilfe wäre willkommen.

+0

Was Ziel für all dies Ihr Ende ist? – Tyler

+0

@Tyler Refreshed meine Seite und verlor die Hälfte der Frage, nicht realisiert. Bitte sehen Sie sich den bearbeiteten Beitrag an. – Zzrot

Antwort

1

Sie können die Typen mit Mustervergleich testen:

val raw = 
    """ 
    |{ 
    | "nulltest": null, 
    | "name": "answer", 
    | "plural": "answers", 
    | "base": "PersistedModel", 
    | "idInjection": true, 
    | "options": { 
    |  "validateUpsert": true 
    | }, 
    | "properties": { 
    |  "sender": { 
    |  "type": "string", 
    |  "required": true, 
    |  "default": "ASK" 
    | }, 
    | "read": { 
    |  "type": "boolean", 
    |  "required": true, 
    |  "default": false 
    | } 
    | } 
    |} 
    """.stripMargin 

val json = Json.parse(raw).as[JsObject] 

json.fields.foreach { 
    case (key, value) => 
    val `type` = value match { 
     case s: JsString => "String" 
     case b: JsBoolean => "Boolean" 
     case o: JsObject => "Object" 
     case n: JsNumber => "Number" 
     case a: JsArray => "Array" 
     case JsNull => "Null" 
    } 
    println(s"key: $key type: ${`type`}") 
} 

Ausgänge:

key: nulltest type: Null 
key: name type: String 
key: plural type: String 
key: base type: String 
key: idInjection type: Boolean 
key: options type: Object 
key: properties type: Object 
+0

Genau das, was ich wollte, danke! – Zzrot

Verwandte Themen