2015-03-15 3 views
0
{ 
    "location":{ 
     "residents":[{ 
      "renting":[{ 
       "name":"John Doe" 
       "pets":"2" 
      },{ 
       "name":"Jane Smith" 
       "pets":"2" 
      }] 
     }] 
    } 
} 

Я могу успешно траверсы место с этим -обход несколько массивов JSON в Play/Scala

val json = ... 

val rentReads = (__ \ 'location).read[String] 

val rentResult = json.validate[String](rentReads) 

rentResult match { 
    case s: JsSuccess[String] => Ok(s.get) 
    case e: JsError => Ok("Errors: " + JsError.toFlatJson(e).toString()) 
} 

На основе документации, я должен быть в состоянии сделать что-то вроде этого -

val skillReads = ((__ \ 'location) \ 'residents)(0).read[String] 

, но это приводит к следующей ошибке -

Errors: {"obj.VariationResultsWrapper.VariationResultSets[0]":[{"msg":"error.path.missing","args":[]}]} 

На данный момент я просто пытаюсь понять, как вернуть значения только из «аренды». В конце концов, я хотел бы сопоставить этот результат с классом case.

ответ

2

Если ваша конечная цель состоит в том, чтобы разобрать это на классы case, просто определите классы case и пусть Play сделает тяжелый подъем.

case class Renting(name: String, pets: String) 
case class Resident(renting: List[Renting]) 
case class Location(residents: List[Resident]) 

implicit val rentingFormat = Json.format[Renting] 
implicit val residentFormat = Json.format[Resident] 
implicit val locationFormat = Json.format[Location] 

(json \ "location").validate[Location] 
res1: play.api.libs.json.JsResult[Location] = JsSuccess(Location(List(Resident(List(Renting(John Doe,2), Renting(Jane Smith,2))))),/residents) 

 Смежные вопросы

  • Нет связанных вопросов^_^