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

แยกวิเคราะห์ JSON

แปลงข้อความเป็นค่า JSON

แยกวิเคราะห์ JSON เป็นบทเรียน Scala for Backend Engineering & Functional Programming ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Scala for Backend Engineering & Functional Programming และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน

ทำไมต้องใช้ Circe

Circe เป็นไลบรารี JSON ยอดนิยมสำหรับ Scala ซึ่งสร้างอยู่บนระบบนิเวศเชิงฟังก์ชันของ cats

ไลบรารีนี้เน้นความปลอดภัยด้านชนิดข้อมูลและความไม่เปลี่ยนแปลง: การแยกวิเคราะห์จะคืนค่า Either แทนการโยนข้อผิดพลาด และการถอดรหัสจะสร้างค่าที่มีชนิดข้อมูลแทนแผนที่ที่ไม่มีชนิดข้อมูล

บทนี้ครอบคลุมการแปลงข้อความ JSON ดิบให้เป็นโมเดล Json ของ Circe

เพิ่มสิ่งที่ต้องพึ่งพา

Circe เผยแพร่เป็นหลายโมดูล สำหรับการแยกวิเคราะห์และโมเดลหลัก คุณต้องใช้ circe-core และ circe-parser

โมดูล circe-generic เพิ่มการสร้างตัวเข้ารหัสและตัวถอดรหัสโดยอัตโนมัติ ซึ่งจะกล่าวถึงในบทถัดไป

libraryDependencies ++= Seq(
  "io.circe" %% "circe-core" % "0.14.6",
  "io.circe" %% "circe-parser" % "0.14.6"
)

ฟังก์ชัน parse

จุดเริ่มต้นสำหรับอ่าน JSON คือ io.circe.parser.parse

ฟังก์ชันนี้รับค่า String และคืนค่า Either[ParsingFailure, Json] ด้านซ้ายเก็บข้อผิดพลาดทางไวยากรณ์ ส่วนด้านขวาเก็บต้นไม้ข้อมูลที่แยกวิเคราะห์แล้ว

import io.circe.parser._

val result = parse("{\"name\": \"Ada\", \"age\": 36}")
// result: Either[ParsingFailure, Json]

จัดการความล้มเหลวในการแยกวิเคราะห์

เนื่องจาก parse คืนค่า Either คุณจึงจัดการข้อผิดพลาดอย่างชัดเจนด้วยการจับคู่รูปแบบหรือตัวประกอบ แทนการใช้ try/catch

ParsingFailure จะมีข้อความที่มนุษย์อ่านเข้าใจได้ ซึ่งอธิบายปัญหาทางไวยากรณ์

parse("{ not valid }") match {
  case Right(json) => println(json)
  case Left(err)   => println(s"Failed: ${err.message}")
}

โมเดล Json

ค่าที่แยกวิเคราะห์สำเร็จคือ Json ซึ่งเป็นต้นไม้ที่ไม่เปลี่ยนแปลงและแทนชนิด JSON ได้หนึ่งในหกชนิด ได้แก่ ออบเจ็กต์ อาร์เรย์ สตริง ตัวเลข บูลีน หรือค่าว่าง

คุณตรวจสอบค่าได้ด้วยเพรดิเคตอย่าง isObject หรือพับการทำงานตามรูปแบบของต้นไม้

val json = parse("[1, 2, 3]").getOrElse(Json.Null)
println(json.isArray)   // true
println(json.isObject)  // false

นำทางด้วยเคอร์เซอร์

หากต้องการอ่านข้อมูลที่ซ้อนกัน ให้เรียก .hcursor บนค่า Json HCursor คือซิปเปอร์ที่ช่วยให้คุณเลื่อนไปตามต้นไม้ได้

ใช้ downField เพื่อเลื่อนลงไปยังคีย์ของออบเจ็กต์

val json = parse("{\"user\": {\"name\": \"Ada\"}}").toOption.get
val cursor = json.hcursor
val name = cursor.downField("user").downField("name").as[String]
// name: Either[DecodingFailure, String] = Right(Ada)

ดึงค่าด้วย as

เมื่อเลื่อนไปยังตำแหน่งที่ต้องการแล้ว .as[A] จะพยายามถอดรหัสค่าที่โฟกัสอยู่ให้เป็นชนิด A

เมธอดนี้คืนค่า Either[DecodingFailure, A] ดังนั้นชนิดข้อมูลที่ไม่ตรงกันจะถูกรายงานเป็นค่า ไม่ใช่ข้อยกเว้น

val json = parse("{\"age\": 36}").toOption.get
val age = json.hcursor.downField("age").as[Int]
println(age)  // Right(36)

parse เทียบกับ decode

ใช้ parse เมื่อคุณต้องการต้นไม้ Json ดิบเพื่อตรวจสอบด้วยตนเอง

ใช้ decode[A] เมื่อคุณต้องการแปลงจาก String เป็นค่าที่มีชนิด A โดยตรงในขั้นตอนเดียว ซึ่งจะรวมการแยกวิเคราะห์และการถอดรหัสเข้าด้วยกัน

import io.circe.parser.decode

val n: Either[io.circe.Error, Int] =
  decode[Int]("42")
println(n)  // Right(42)

ฟิลด์ที่ไม่บังคับ

JSON ในโลกจริงมักมีคีย์ที่หายไป เมธอดเคอร์เซอร์ get[A] บนฟิลด์ที่เลื่อนลงไปจะล้มเหลวหากไม่พบคีย์ ส่วน getOrElse จะจัดเตรียมค่าเริ่มต้นให้

การถอดรหัสเป็น Option[A] จะถือว่าฟิลด์ที่หายไปหรือมีค่า null เป็น None

val json = parse("{\"name\": \"Ada\"}").toOption.get
val nick = json.hcursor.get[Option[String]]("nickname")
println(nick)  // Right(None)

แยกวิเคราะห์อาร์เรย์

คุณสามารถถอดรหัสอาร์เรย์ JSON เป็นคอลเลกชันของ Scala ได้โดยตรง ด้วยการระบุเป็น List[A] หรือ Vector[A]

Circe จะแปลงองค์ประกอบแต่ละรายการ และหยุดทันทีพร้อม DecodingFailure หากองค์ประกอบใดมีชนิดไม่ถูกต้อง

import io.circe.parser.decode

val xs = decode[List[Int]]("[1, 2, 3]")
println(xs)  // Right(List(1, 2, 3))

การจัดรูปแบบเพื่อแสดงผล

ค่า Json ใด ๆ สามารถแปลงกลับเป็นข้อความด้วย .noSpaces สำหรับผลลัพธ์แบบกระชับ หรือ .spaces2 สำหรับผลลัพธ์ที่เยื้องบรรทัด

วิธีนี้ช่วยแปลงข้อมูลที่แยกวิเคราะห์แล้วกลับไปกลับมา และมีประโยชน์สำหรับการบันทึกหรือการแก้ไขข้อผิดพลาด

val json = parse("{\"a\":1,\"b\":2}").toOption.get
println(json.noSpaces)
println(json.spaces2)

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับการแยกวิเคราะห์ด้วย Circe

สรุปทบทวน

คุณได้เรียนรู้การแปลงข้อความ JSON ให้เป็นโมเดลของ Circe แล้ว parse ให้ผลเป็น Either[ParsingFailure, Json] ส่วน decode[A] จะแปลงตรงไปยังค่าที่มีชนิดข้อมูล

HCursor ใช้ downField เพื่อนำทาง และ .as[A] ใช้ดึงค่าที่มีชนิดข้อมูล ความล้มเหลวจะถูกเก็บเป็นค่า ไม่ใช่ข้อยกเว้น

คำถามที่พบบ่อย

บทเรียน “แยกวิเคราะห์ JSON” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “แยกวิเคราะห์ JSON” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Scala for Backend Engineering & Functional Programming ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “แยกวิเคราะห์ JSON”

แปลงข้อความเป็นค่า JSON คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Scala for Backend Engineering & Functional Programming หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Scala for Backend Engineering & Functional Programming บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 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