แยกวิเคราะห์ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ