【问题标题】:Spray json parsing and NullPointerException喷json解析和NullPointerException
【发布时间】:2014-03-06 22:50:43
【问题描述】:

我有一个错误:

spray.json.ProductFormats$class.productElement2Field NullPointerException

这是我的 json 反序列化代码:

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 

我猜这可能是因为 RequestHolder 类中的构造函数重载。

更新: json内容为:

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

【问题讨论】:

    标签: json scala nullpointerexception spray-json


    【解决方案1】:

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

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

    这里Things 案例类有一个Thing 的列表。

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

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

    让它工作。

    所有感谢:https://stackoverflow.com/a/29280316/1539208

    【讨论】:

    • 这在 2021 年现在甚至很有帮助。我想它应该在编译时被捕获。
    【解决方案2】:

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

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

    现在解析工作正常!

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题,对我来说是lazyFormat 解决了这个问题:

      implicit val requestStatusFormat: JsonFormat[RequestStatus] = lazyFormat(jsonFormat2(RequestStatus))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-24
        • 2014-08-12
        • 2013-05-01
        • 2014-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多