2017-05-31 57 views
1

在我的发挥框架程序,我发送JSON到后端,后端中我想在阵列访问在JSON斯卡拉request.body.asJson访问阵列

我尝试这样做:

val processSteps = request.body.asJson.map{ 
    json => (json \ "stepsData").asOpt[Object].map { steps => 
    println(steps) 
} 

for (processStep <- steps) { 

    processStep.map(_.validate[ProcessStepTemplatesModel] match { 

stepsData是一个数组,我想访问

请求:

Some({"steps":"","stepsData":[{"steptitle":"sd","title":"asd"}],"stepType":"duty","createdat":"2017-05-31 14:30:26","updatedat":"2017-05-31 14:30:26","activeSnackbar":false,"snackbarText":{"type":"span","key":null,"ref":null,"props":{"children":[{"key":null,"re 
f":null,"props":{"value":"snackbar.processes.createProcess"},"_owner":null,"_store":{}},": ",null]},"_owner":null,"_store":{}},"approvedProcessTemplates":[],"approveprocess":17,"approveprocessTitle":"Felix","trainingsprocess":47,"trainprocessTitle":"Posaune","d 
eleted":false,"dialogActive":false,"title":"ads","processtemplate":1,"loaded":true,"version":"asd","responsible":"asd","accountable":"asd","consulted":"asd","informed":"asd","deadline":"2017-05-18T12:30:09.460Z","dialogActions":[{"label":{"key":null,"ref":null, 
"props":{"value":"dialog.processes.deleteProcess.cancel"},"_owner":null,"_store":{}}}],"dialogTitle":{"key":null,"ref":null,"props":{"value":"dialog.processes.selectProcessTemplate.trainingsprocess.header"},"_owner":null,"_store":{}},"dialogHandlerVariable":1}) 

回答

3

你能告诉我你的数据是怎样的?

我会处理这个是这样的,有一个案例类stepsData:

case class StepData(attributes ..) 

,然后有一个包装:

case class StepDataWrapper(stepsData : List[StepData]) 

然后在您的控制器指定一个隐含的格式:

import play.api.libs.json._ 

implicit val stepDataFormat = Json.format[StepData] 

implicit val stepDataListWrapperFormat =Json.format[StepDataWrapper] 

然后,

val processSteps = request.body.asJson.asOpt[StepDataWrapper] 
        .map{ 
        stepDataWrapper => stepDataWrapper.stepsData.map(println(_)) 
        } 
+0

增加了 – Felix

+0

以上的请求,定义了这种情况下的类:StepData(steptitle:String,title:String) 并按照上面的方式继续工作。 –

+0

也许下面这可以帮助你:https://stackoverflow.com/questions/34437520/making-reads-and-writes-in-scala-play-for-lists-of-custom-classes –

1

你应该这样做的JSON验证,T帽子是你asOpt方法:

(json \ "stepsData").asOpt[Array[ProcessStepTemplatesModel]] 

如果你在身体使用等各个领域,你甚至可以定义预期的身体的情况下阶层,并直接验证它:

case class StepProcessingRequestData(
    stepsData: Array[ProcessStempTemplatesModel], 
    ... // add your other fields, as defined in your JSON schema 
) 

object StepProcessingRequestData { 
    implicit val reads = Json.reads[StepProcessingRequestData] 
} 

val processStepsOpt: Option[StepProcessingRequestData] = 
    request.body.asJson.flatMap(_.asOpt[StepProcessingRequestData]) 
+0

第一次没有返回任何东西,第二批错误;) – Felix

+1

什么样的错误?你有隐式的'Reads [StepProcessingRequestData]'范围吗?它是否验证数组中的元素? –