2016-10-04 2 views
0

У меня есть следующий случай класс:Play JSON Ошибка чтения при чтении последовательности

case class VirtualAssetConfigParam(
    id: Long, 
    pMin: Double, 
    pMax: Double, 
    dispatchPriority: Int 
) 

object VirtualAssetConfigParam { 

    implicit val virtualAssetConfigParamReads: Reads[VirtualAssetConfigParam] = (
    (JsPath \ "id").read[Long] and 
     (JsPath \ "power_min").read[Double] and 
     (JsPath \ "power_max").read[Double] and 
     (JsPath \ "dispatch_priority").read[Int] 
    )(VirtualAssetConfigParam.apply _) 
} 

Это JSON, что я получаю из базы данных:

[{"id":"1","power_min":"200","power_max":"400","dispatch_priority":"1"},{"id":"2","power_min":"200","power_max":"400","dispatch_priority":"2"},{"id":"3","power_min":"-700","power_max":"0","dispatch_priority":"3"}] 

Когда я попытался проверить его как (где virtualAssetConfigParam это строка, я получаю из базы данных):

Json.parse(virtualAssetConfigParam).validate[List[VirtualAssetConfigParam]] 

я получаю следующее в качестве проверенного RESU lt:

JsError(
    List(
     ((0)/dispatchPriority,List(ValidationError(List(error.path.missing),WrappedArray()))), 
     ((0)/pMin,List(ValidationError(List(error.path.missing),WrappedArray()))), 
     ((0)/pMax,List(ValidationError(List(error.path.missing),WrappedArray()))), 
     ((0)/id,List(ValidationError(List(error.expected.jsnumber),WrappedArray()))), 
     ((1)/dispatchPriority,List(ValidationError(List(error.path.missing),WrappedArray()))), 
     ((1)/pMin,List(ValidationError(List(error.path.missing),WrappedArray()))), 
     ((1)/pMax,List(ValidationError(List(error.path.missing),WrappedArray()))), 
     ((1)/id,List(ValidationError(List(error.expected.jsnumber),WrappedArray()))), 
     ((2)/dispatchPriority,List(ValidationError(List(error.path.missing),WrappedArray()))), 
     ((2)/pMin,List(ValidationError(List(error.path.missing),WrappedArray()))), 
     ((2)/pMax,List(ValidationError(List(error.path.missing),WrappedArray()))), 
     ((2)/id,List(ValidationError(List(error.expected.jsnumber),WrappedArray()))) 
    ) 
) 

В чем проблема? Я не мог понять, почему это должно потерпеть неудачу!

+0

'Json.parse' используется для разбора' Json-string' в представлении Json PlayJson, которое является 'JsValue'. Если у вас уже есть JsValue ... вам тоже не нужно разбираться, и вы не можете его разобрать. –

+0

Хорошо! Извините за путаницу. JSON читается как строка из базы данных, и я анализирую его на JsValue с помощью Json.parse (...) – sparkr

+0

Если это простая строка, вы можете использовать Json.toJson («string») –

ответ

0

Типы данных в JSON не соответствуют ожидаемым типам данных в классе case. Таким образом, класс случай должен быть:

implicit val virtualAssetConfigParamReads: Reads[VirtualAssetConfigParam] = new Reads[VirtualAssetConfigParam] { 
    override def reads(json: JsValue): JsResult[VirtualAssetConfigParam] = { 
     JsSuccess(VirtualAssetConfigParam(
     (json \ "id").as[String].toLong, 
     (json \ "power_min").as[String].toDouble, 
     (json \ "power_max").as[String].toDouble, 
     (json \ "dispatch_priority").as[String].toInt 
    )) 
    } 
    } 

Когда я теперь вызов функции синтаксического анализа на JSON, я делаю это так:

Try((Json.parse(json)).validate[Seq[VirtualAssetConfigParam]]) 

, а затем свернуть на успех Попробовать!

0

Вы можете посмотреть на моем блоге некоторое время назад, это может помочь вам:

http://pedrorijo.com/blog/scala-json/

и

http://pedrorijo.com/blog/scala-json-part2/

+0

Это не к сожалению! Пожалуйста, также не публикуйте ссылки, поскольку они могут не существовать через некоторое время! – sparkr

+0

, хотя вы могли бы использовать один из альтернатив. Вы пытались проверить его на консоли sbt? Создайте один объект json (а не массив) и попытайтесь разобрать.просто чтобы убедиться, что ошибка при анализе объекта или разбор списка – pedrorijo91

+0

Анализ одного класса case работает, но проблема заключается только в том, что он является массивом! – sparkr

0

Если вы посмотрите на свою ошибку, вы заметите, что пытается найти пути - dispatchPriority, pMin, pMax и id, который отличается от путей, которые вы хотели в своем read. Это означает, что реализация чтения, которую вы указали в коде, здесь не используется.

Это заставляет меня думать, что, вероятно, вы не импортируете свое неявное чтение в область вашего кода.

case class VirtualAssetConfigParam(
    id: Long, 
    pMin: Double, 
    pMax: Double, 
    dispatchPriority: Int 
) 

object VirtualAssetConfigParam { 

    implicit val virtualAssetConfigParamReads: Reads[VirtualAssetConfigParam] = (
    (JsPath \ "id").read[Long] and 
    (JsPath \ "power_min").read[Double] and 
    (JsPath \ "power_max").read[Double] and 
    (JsPath \ "dispatch_priority").read[Int] 
)(VirtualAssetConfigParam.apply _) 

} 

object Demo extends App { 

    // I think you are missing this import 
    import VirtualAssetConfigParam.virtualAssetConfigParamReads 

    val virtualAssetConfigParam = [{"id":"1","power_min":"200","power_max":"400","dispatch_priority":"1"},{"id":"2","power_min":"200","power_max":"400","dispatch_priority":"2"},{"id":"3","power_min":"-700","power_max":"0","dispatch_priority":"3"}] 

// It should work if you have that import 
val jsonValidate = Json.parse(virtualAssetConfigParam).validate[List[VirtualAssetConfigParam]] 


} 
+0

Вы пытались запустить код, который вы опубликовали? Я знаю, что мне нужно импортировать неявный val. Если не так, как я мог бы скомпилировать его в первую очередь? Ваш демонстрационный объект не работает при запуске, так как вы можете видеть, что типы данных в Json не совпадают. Например, power_min - это String в Json, но класс case пытается прочитать его как Double, и это не удается. Поэтому попробуйте запустить его, а затем опубликуйте свои результаты. Я нашел решение, которое я разместил здесь! – sparkr

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