2015-03-11 3 views
1

Я не могу разобрать json, я получаю как карту. У кого-нибудь есть идеи? Пожалуйста, спросите, требуется ли вам дополнительная информация. Спасибо :)Невозможно разобрать Json как карту - Scala/Play

Пытаясь разобрать следующий ответ с помощью:

Json.parse(response.body).as[Map[String, Either[List[ErrorMsg], Seq[OepPoint]]]] 

Ответ:

{ 
    "Payout": { 
    "errors":[ 
     { 
     "field": "Last point: OepPoint(0.033,72.14). Current: OepPoint(0.033,65.71)", 
     "message":"OEP must be unique" 
     } 
    ], 
    "curve":[] 
    } 
} 

Сообщение об ошибке бросили это:

No Json deserializer found for type Map[String,Either[List[ErrorMsg],Seq[OepPoint]]]. Try to implement an implicit Reads or Format for this type. 
[error]  val errorExpected = Json.parse(response.body).as[Map[String, Either[List[ErrorMsg], Seq[OepPoint]]]] 
[error]             ^
[error] one error found 

Структура OepPoint:

case class OepPoint(oep: Double, loss: Double) 

object OepPoint { 
    implicit val oepPointReads = Json.format[OepPoint] 
} 

Структура ErrorMsg:

case class ErrorMsg(field: String, message: String) 

object ErrorMsg { 
    implicit val errorMsgReads = Json.format[ErrorMsg] 
} 
+0

Можете ли вы форматировать вещи, чтобы быть более читаемыми. –

+0

Play-json предоставляет 'Read' для обычных типов, таких как 'String',' Int', 'List [A]' и т. Д. В случае таких общих типов, как 'List [A]', 'implicit Read' для' A 'потребуется. Вам нужно будет предоставить 'implicit'' Read 'для ваших собственных типов. Которые - вероятно, «OepPoint» и «ErrorMsg». –

+0

Я предполагаю, что способ, которым я определил мой OepPoint atm, неверен? 'случай класса OepPoint (ОЭП: Двойная, потеря: Double) объекта OepPoint { неявных значи oepPointReads = Json.format [OepPoint] }' – user4659009

ответ

0

Если у вас есть соответствующие Read с для OepPoint и ErrorMsg. Вы можете сделать следующее.

case class ErrOrOep(errors: List[ ErrorMsg ], curve: List[ OepPoint ]) 

implcit val errOrOepFormat = Json.format[ ErrOrOep ] 

val jsonMap = Json.parse(response.body).as[ Map[String, ErrOrOep ] ] 

val errOrOep = jsonMap("Payout") 

val oepEither: Either[ List[ ErrorMsg ], List[ OepPoint ] ] = 
    (errOrOep.errors, errOrOep.curve) match { 
    case (_, h :: _) => Right(errOrOep.curve) 
    case (h :: _, _ ) => Left(errOrOep.error) 
    case (_, _) => Left(errOrOep.error) 
    } 
Смежные вопросы