5

i'm got an error:

spray.json.ProductFormats$class.productElement2Field NullPointerException

Here is my code for json deserialisation:

object DomainJsonProtocol extends DefaultJsonProtocol {
implicit val loginInfoFormat = jsonFormat(LoginInfo, "userid", "email", "password", "rememberme")
implicit val requestStatusFormat = jsonFormat(RequestStatus, "status", "message")
implicit val requestHolderFormat = jsonFormat(RequestHolder, "requestStatus", "loginInfo")
}

case class RequestHolder(requestStatus : RequestStatus, loginInfo: LoginInfo) {
  def this(requestStatus : RequestStatus) = this(requestStatus, null)
}
case class LoginInfo(userid: Int, email: String, password: String, rememberme: Boolean)
case class RequestStatus(status : Int, message: String)

val requestHolder = content.asJson.convertTo[RequestHolder] //The error is hereHere is 

I guess it could be because of the overloaded constructors in the class RequestHolder.

upd: The json content is:

{"requestStatus":{"status":0,"message":""},"loginInfo":{"userid":0,"email":"123","password":"123","rememberme":false}}
4

3 回答 3

9

我有一个类似的问题,我的问题是由于我定义 jsonreaders 的顺序。我有一个这样的例子:

implicit val multipleThings: RootJsonFormat[Things] = jsonFormat1(Things)
implicit val singleThing: RootJsonFormat[Thing] = jsonFormat1(Thing)

这里的Thingscase 类有一个Thing's 列表。

这不起作用,因为第一个隐含地需要第二个。像这样重新排序它们:

implicit val singleThing: RootJsonFormat[Thing] = jsonFormat1(Thing)
implicit val multipleThings: RootJsonFormat[Things] = jsonFormat1(Things)

让它工作。

全部归功于:https ://stackoverflow.com/a/29280316/1539208

于 2018-10-18T12:04:09.840 回答
1

我在官方喷雾邮件列表中找到了解决方案,解决方案是在构造函数中使用 Option[MyClass] = None,而不是使用 null 覆盖构造函数,例如,我的类定义如下所示:

case class RequestHolder(requestStatus : RequestStatus,  loginInfo: Option[LoginInfo] = None)

现在解析工作正常!

于 2014-02-10T10:30:00.037 回答
0

我有一个类似的问题,对我来说是lazyFormat修复了它:

implicit val requestStatusFormat: JsonFormat[RequestStatus] = lazyFormat(jsonFormat2(RequestStatus))
于 2018-07-08T20:22:53.513 回答