0Pricing
Scala for Backend Engineering & Functional Programming · บทเรียน

เข้ารหัสเป็น 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แยกวิเคราะห์ JSON
  2. ถอดรหัสเป็นคลาสแบบเคส
  3. เข้ารหัสเป็น JSON
  4. ตัวเข้ารหัสและถอดรหัสแบบกำหนดเอง
← กลับไปที่ Scala for Backend Engineering & Functional Programming