使用JSON Play处理null

我正在尝试使用Play库为某些字段解析具有空值的json。有一个代表数据的案例类:

_,_,serr := syscall.Syscall(syscall.SYS_SETUID,1,0)

以下是当前解析的工作方式:

case class Id(value: Int) extends AnyVal

case class Name(value: String) extends AnyVal

case class Number(value: Int) extends AnyVal

case class Data(id: Option[Id],name: Option[Name],number: Option[Number])

使用特定数据类型进行解析不能处理空值,因此此实现返回:

def parse(jsValue: JsValue): Try[Seq[Data]] = Try {
    jsValue.as[JsArray].value
      .flatMap { record =>
        val id = Id((record \ "id").as[Int])
        val name = Name((record \ "name").as[String])
        val number = Number((record \ "number").as[Int])

        Some(Data(Some(id),Some(name),Some(number)))
      }
  }

对于这样的输入数据:

Failure(play.api.libs.json.JsResultException: JsResultException(errors:List((,List(JsonValidationError(List(error.expected.jsstring),WrappedArray()))))))

我想要这样的东西:{ "id": 1248,"default": false,"name": null,"number": 2 }

我打算将数据写入数据库,所以我不介意为这些字段写一些空值。

如何处理解析的json中字段的空值?

laiyong369 回答:使用JSON Play处理null

您可以简单地让play-json库为您的案例类生成Reads,而无需手动编写它们:

import play.api.libs.json._

object Data {
  implicit val reads: Reads[Data] = {
    // move these into the corresponding companion objects if used elsewhere...
    implicit val idReads = Json.reads[Id]
    implicit val numberReads = Json.reads[Number]
    implicit val nameReads = Json.reads[Name]

    Json.reads[Data]
  }
}

def parse(jsValue: JsValue): Try[Seq[Data]] = Json.fromJson[Seq[Data]](jsValue).toTry

这样,即使您更改案例类的参数,您的代码也可以正常工作。

如果您仍要手动编码,则可以使用readNullable解析器:

val name: Option[Name] = Name(record.as((__ \ "name").readNullable[String]))

但是请注意,在FP中使用Try有点不习惯,而直接使用JsResult会更习惯。

,

如果您没有被锁定使用play-json,那么让我展示一下如何使用jsoniter-scala轻松完成:

import com.github.plokhotnyuk.jsoniter_scala.core._
import com.github.plokhotnyuk.jsoniter_scala.macros._

implicit val codec: JsonValueCodec[Seq[Data]] = JsonCodecMaker.make(CodecMakerConfig)

val json: Array[Byte] = """[
  {
    "id": 1248,"default": false,"name": null,"number": 2
  }
]""".getBytes("UTF-8")
val data: Seq[Data] = readFromArray(json)
println(data)

这将产生以下输出:

List(Data(Some(Id(1248)),None,Some(Number(2))))

Here,您将看到一个如何将其与Play框架集成的示例。

本文链接:https://www.f2er.com/3131590.html

大家都在问