เข้ารหัสเป็น JSON
ทำให้ข้อมูลของคุณเป็นอนุกรม
เข้ารหัสเป็น JSON เป็นบทเรียน Scala for Backend Engineering & Functional Programming ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Scala for Backend Engineering & Functional Programming และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน
ตัวเข้ารหัสสร้าง JSON
Encoder[A] เป็นคู่ตรงข้ามของตัวถอดรหัส โดยแปลงค่า Scala ชนิด A ให้เป็นต้นไม้ Json ของ Circe
จากนั้นคุณจะแปลงเป็น String เพื่อใช้ในการตอบกลับ HTTP บันทึก หรือจัดเก็บข้อมูล
ไวยากรณ์ asJson
นำเข้า io.circe.syntax._ เพื่อให้ได้เมธอดส่วนขยาย .asJson บนค่าใด ๆ ที่มี Encoder อยู่ในขอบเขต
ชนิดพื้นฐานและคอลเลกชันต่าง ๆ ใช้งานได้ทันที
import io.circe.syntax._
println(42.asJson.noSpaces) // 42
println("hi".asJson.noSpaces) // "hi"
println(List(1,2,3).asJson.noSpaces) // [1,2,3]การสร้างตัวเข้ารหัส
เช่นเดียวกับตัวถอดรหัส ตัวเข้ารหัสสำหรับคลาสกรณีจะถูกสร้างขึ้นเช่นกัน ให้นำเข้า io.circe.generic.auto._ เพื่อสร้างโดยอัตโนมัติ
ชื่อฟิลด์จะกลายเป็นคีย์ JSON และค่าของฟิลด์จะถูกเข้ารหัสแบบวนซ้ำ
import io.circe.generic.auto._
import io.circe.syntax._
case class User(name: String, age: Int)
println(User("Ada", 36).asJson.noSpaces)
// {"name":"Ada","age":36}ตัวเข้ารหัสแบบกึ่งอัตโนมัติ
สำหรับอินสแตนซ์ที่กำหนดอย่างชัดเจนและนำกลับมาใช้ซ้ำได้ ให้ใช้ deriveEncoder จาก io.circe.generic.semiauto
การวางไว้ในออบเจ็กต์คู่หูจะทำให้มี Encoder[User] ที่ใช้ร่วมกันหนึ่งตัวทั่วทั้งโค้ดเบส
import io.circe.Encoder
import io.circe.generic.semiauto._
object User {
implicit val enc: Encoder[User] = deriveEncoder[User]
}สร้าง Json ด้วยตนเอง
คุณสามารถสร้าง JSON ได้โดยตรงด้วย Json.obj และคู่คีย์/ค่า โดยค่าต่าง ๆ ใช้ .asJson
วิธีนี้สะดวกสำหรับโครงสร้างเฉพาะกิจที่ไม่ตรงกับคลาสกรณี
import io.circe.Json
import io.circe.syntax._
val j = Json.obj(
"ok" -> true.asJson,
"count" -> 3.asJson
)
println(j.noSpaces) // {"ok":true,"count":3}ตัวเลือกการเข้ารหัส
ฟิลด์ Option[A] จะเข้ารหัส Some(x) เป็นค่า และเข้ารหัส None เป็น JSON null โดยค่าเริ่มต้น
หากต้องการละเว้นคีย์ null ทั้งหมด คุณสามารถลบออกหลังการเข้ารหัสได้ ซึ่งจะกล่าวถึงในภายหลัง
case class Account(id: Long, nick: Option[String])
println(Account(7, None).asJson.noSpaces)
// {"id":7,"nick":null}ลบค่า Null
หากต้องการละเว้นค่า null ให้แปลง Json ที่ได้ด้วย .deepDropNullValues
วิธีนี้จะลบคีย์ที่มีค่า null แบบวนซ้ำ ทำให้ผลลัพธ์ของฟิลด์ที่ไม่บังคับดูสะอาดขึ้น
val clean = Account(7, None).asJson.deepDropNullValues
println(clean.noSpaces)
// {"id":7}จัดรูปแบบผลลัพธ์เพื่อแสดงผล
ใช้ .spaces2 หรือ .spaces4 สำหรับ JSON ที่มีการเยื้องและอ่านได้ง่ายสำหรับมนุษย์ และใช้ .noSpaces สำหรับรูปแบบข้อมูลขนาดกะทัดรัดที่ใช้ส่งผ่านเครือข่าย
หากต้องการควบคุมการจัดรูปแบบอย่างเต็มที่ ให้สร้าง Printer แบบกำหนดเอง
import io.circe.Printer
val printer = Printer.spaces2.copy(dropNullValues = true)
println(printer.print(Account(7, None).asJson))การเข้ารหัส Map
Map[String, A] จะถูกเข้ารหัสเป็นออบเจ็กต์ JSON โดยคีย์ของ map จะกลายเป็นคีย์ JSON
สำหรับชนิดคีย์ที่ไม่ใช่สตริง คุณต้องจัดเตรียม KeyEncoder ที่แปลงคีย์ให้อยู่ในรูปข้อความ
import io.circe.syntax._
val scores = Map("ada" -> 90, "alan" -> 85)
println(scores.asJson.noSpaces)
// {"ada":90,"alan":85}การแมปกับ Encoder
คุณสามารถปรับใช้ encoder ที่มีอยู่แล้วด้วย contramap โดยส่งฟังก์ชันจากชนิดของคุณไปยังชนิดที่ Circe รองรับการเข้ารหัสอยู่แล้ว
วิธีนี้ช่วยหลีกเลี่ยงการเขียน encoder ทั้งหมดขึ้นมาใหม่
import io.circe.Encoder
case class UserId(value: Long)
implicit val enc: Encoder[UserId] =
Encoder[Long].contramap(_.value)การเข้ารหัสและถอดรหัสร่วมกัน
เมื่อคุณต้องการทั้งสองทิศทาง ให้สร้าง Codec[A] เดียวด้วย deriveCodec ซึ่งรวม encoder และ decoder ไว้ด้วยกัน
วิธีนี้ช่วยให้ทั้งสองส่วนสอดคล้องกันเมื่อ case class มีการเปลี่ยนแปลง
import io.circe.Codec
import io.circe.generic.semiauto._
implicit val codec: Codec[User] = deriveCodec[User]ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับการเข้ารหัสเป็น JSON
สรุปทบทวน
Encoder[A] แปลงค่าของ Scala ให้เป็น Json ใช้ .asJson ร่วมกับ encoder ที่สร้างจากการอนุมาน หรือสร้างโครงสร้างต้นไม้ด้วย Json.obj
None จะกลายเป็น null เว้นแต่คุณจะลบออก contramap ช่วยนำ encoder กลับมาใช้ซ้ำ และ deriveCodec รวมทั้งสองทิศทางไว้ด้วยกัน
คำถามที่พบบ่อย
บทเรียน “เข้ารหัสเป็น JSON” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “เข้ารหัสเป็น JSON” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Scala for Backend Engineering & Functional Programming ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “เข้ารหัสเป็น JSON”
ทำให้ข้อมูลของคุณเป็นอนุกรม คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Scala for Backend Engineering & Functional Programming หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Scala for Backend Engineering & Functional Programming บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “เข้ารหัสเป็น JSON” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Scala for Backend Engineering & Functional Programming นี้ได้ไหม
ได้ บทเรียน Scala for Backend Engineering & Functional Programming ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ