在Scala中进行REST调用时的JSON数据转换涉及两个主要方面:
Scala中有多个流行的JSON处理库:
import play.api.libs.json._
import play.api.libs.functional.syntax._
// 定义case class
case class User(id: Int, name: String, email: String)
// 隐式定义JSON格式
implicit val userFormat: Format[User] = Json.format[User]
// 序列化
val user = User(1, "John Doe", "john@example.com")
val json: JsValue = Json.toJson(user)
val jsonString: String = Json.stringify(json)
// 反序列化
val parsedJson: JsValue = Json.parse(jsonString)
val parsedUser: User = parsedJson.as[User]
import io.circe._
import io.circe.generic.auto._
import io.circe.parser._
import io.circe.syntax._
case class Product(id: Int, name: String, price: Double)
// 序列化
val product = Product(101, "Laptop", 999.99)
val json: Json = product.asJson
val jsonString: String = json.noSpaces
// 反序列化
val parsedJson: Either[Error, Json] = parse(jsonString)
val parsedProduct: Either[Error, Product] = parsedJson.flatMap(_.as[Product])
import play.api.libs.ws._
import play.api.libs.json._
import scala.concurrent.Future
case class Post(title: String, body: String, userId: Int)
implicit val postFormat: Format[Post] = Json.format[Post]
def createPost(post: Post)(implicit ws: WSClient): Future[Post] = {
ws.url("https://jsonplaceholder.typicode.com/posts")
.post(Json.toJson(post))
.map { response =>
response.json.as[Post]
}
}
原因:
解决方案:
validate
代替as
获取更详细的错误信息val result: JsResult[User] = Json.parse(jsonString).validate[User]
result match {
case JsSuccess(user, _) => println(s"Success: $user")
case JsError(errors) => println(s"Errors: $errors")
}
implicit val userReads: Reads[User] = (
(JsPath \ "user_id").read[Int] and
(JsPath \ "user_name").read[String] and
(JsPath \ "user_email").read[String]
)(User.apply _)
case class UserProfile(id: Int, name: String, age: Option[Int])
implicit val profileFormat: Format[UserProfile] = Json.format[UserProfile]
import play.api.libs.json._
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
implicit val dateTimeFormat: Format[LocalDateTime] =
Format[LocalDateTime](
Reads.localDateTimeReads("yyyy-MM-dd'T'HH:mm:ss"),
Writes.localDateTimeWrites("yyyy-MM-dd'T'HH:mm:ss")
)
case class Event(id: Int, timestamp: LocalDateTime)
implicit val eventFormat: Format[Event] = Json.format[Event]
通过选择合适的JSON库并正确实现转换逻辑,可以在Scala应用中高效地处理REST调用的JSON数据转换需求。
没有搜到相关的文章