0Pricing
Lua Academy · บทเรียน

จัดการข้อมูลซ้อนกัน

ทำงานกับโครงสร้างซับซ้อน

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

ข้อมูลซ้อนกันอยู่ทุกที่

JSON ในโลกจริงแทบไม่แบนราบ ออบเจ็กต์มีออบเจ็กต์อื่นอยู่ภายใน และอาร์เรย์ก็มีออบเจ็กต์อยู่ภายใน โดยมักซ้อนกันหลายระดับ

ใน Lua นั่นหมายถึงมีตารางอยู่ภายในตาราง ข่าวดีคือ decode และ encode จัดการข้อมูลที่ซ้อนกันให้โดยอัตโนมัติ

ออบเจ็กต์ภายในออบเจ็กต์

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

local json = require("dkjson")
local d = json.decode('{"user": {"name": "Eve", "age": 30}}')
print(d.user.name)
print(d.user.age)

อาร์เรย์ของออบเจ็กต์

โครงสร้างที่พบได้บ่อยมากคืออาร์เรย์ JSON ของออบเจ็กต์ ซึ่งมีลักษณะเหมือนรายการระเบียนข้อมูล โดยจะถูกถอดรหัสเป็นลำดับของตาราง

วนซ้ำด้วย ipairs แล้วอ่านฟิลด์จากแต่ละรายการ

local json = require("dkjson")
local d = json.decode('[{"id":1},{"id":2}]')
for _, item in ipairs(d) do
  print(item.id)
end

การเข้าถึงข้อมูลที่ซ้อนลึก

คุณสามารถเข้าถึงข้อมูลต่อกันได้ลึกเท่าที่ข้อมูลซ้อนอยู่ แต่ละระดับเป็นเพียงการค้นหาตารางอีกชั้นหนึ่ง

อย่างไรก็ตาม หากระดับกลางระดับใดขาดหายไป สายการเข้าถึงจะเกิดข้อผิดพลาดว่า 'พยายามใช้ดัชนีกับค่าที่ไม่มี'

local json = require("dkjson")
local d = json.decode('{"a":{"b":{"c": 42}}}')
print(d.a.b.c)

การเข้าถึงข้อมูลซ้อนอย่างปลอดภัย

เพื่อหลีกเลี่ยงการหยุดทำงานเมื่อระดับใดขาดหายไป ให้ตรวจสอบแต่ละขั้นหรือใช้การลัดวงจรด้วย and

สายโซ่ and จะหยุดที่ค่า nil แรก และส่งคืนค่า nil แทนที่จะทำให้เกิดข้อผิดพลาด

local json = require("dkjson")
local d = json.decode('{"a":{}}')
local c = d.a and d.a.b and d.a.b.c
print(c)  -- nil, no crash

การวนซ้ำในอาร์เรย์ที่ซ้อนกัน

อาร์เรย์สามารถเก็บออบเจ็กต์ที่มีอาร์เรย์อื่นอยู่ภายในได้ ให้ซ้อนลูปให้สอดคล้องกับโครงสร้าง

local json = require("dkjson")
local d = json.decode('[{"tags":["a","b"]}]')
for _, rec in ipairs(d) do
  for _, tag in ipairs(rec.tags) do
    print(tag)
  end
end

การสร้างตารางซ้อนกัน

หากต้องการเข้ารหัส JSON ที่ซ้อนกัน เพียงซ้อนตาราง Lua ไว้ภายในกัน ตัวเข้ารหัสจะเดินสำรวจโครงสร้างทั้งหมดแบบเรียกตัวเองซ้ำ

local json = require("dkjson")
local t = {
  user = { name = "Jo", roles = { "admin", "editor" } }
}
print(json.encode(t, { indent = true }))

การแก้ไขค่าที่ซ้อนกัน

คุณสามารถอ่าน เปลี่ยนแปลง และเพิ่มฟิลด์ที่ระดับใดก็ได้ก่อนเข้ารหัสอีกครั้ง นี่คือหัวใจของการแปลงข้อมูล

local json = require("dkjson")
local d = json.decode('{"cfg":{"volume":5}}')
d.cfg.volume = 8
d.cfg.muted = false
print(json.encode(d))

การผสมอาร์เรย์กับออบเจ็กต์

JSON สามารถผสมอาร์เรย์และออบเจ็กต์ในระดับต่าง ๆ ได้อย่างอิสระ Lua ก็จำลองรูปแบบนี้ด้วยการซ้อนตารางแบบลำดับและตารางแบบใช้คีย์เข้าด้วยกัน

เพียงตรวจสอบให้แน่ใจว่าตารางแต่ละตารางมีรูปแบบใดรูปแบบหนึ่งอย่างสม่ำเสมอ

local json = require("dkjson")
local t = {
  team = "red",
  members = { { id = 1 }, { id = 2 } }
}
print(json.encode(t))

การสำรวจโครงสร้างที่ไม่ทราบรูปแบบ

เมื่อคุณไม่ทราบรูปแบบล่วงหน้า ให้ใช้ type() ตรวจสอบค่าแต่ละค่า และเรียกตัวเองซ้ำเมื่อพบตาราง

วิธีนี้ทำให้คุณเขียนตัวประมวลผลทั่วไปสำหรับ JSON รูปแบบใด ๆ ได้

local function walk(v)
  if type(v) == "table" then
    for k, sub in pairs(v) do walk(sub) end
  else
    print(v)
  end
end

ระวังค่าว่างในข้อมูลซ้อน

ค่าว่างที่อยู่ลึกภายในข้อมูลซ้อนยังคงถูกถอดรหัสเป็น json.null ใน dkjson โปรดคำนึงถึงกรณีนี้เมื่อสำรวจโครงสร้าง เพื่อไม่ให้เข้าใจผิดว่าเป็นตารางหรือค่าจริง

local json = require("dkjson")
local d = json.decode('{"a":{"b": null}}')
if d.a.b == json.null then
  print("b is null")
end

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

ทดสอบความสามารถของคุณในการจัดการ JSON ที่ซ้อนกันใน Lua

ทบทวน

JSON ที่ซ้อนกันจะถูกแปลงเป็นตารางที่อยู่ภายในตาราง โดย decode และ encode จะจัดการการเรียกตัวเองซ้ำให้คุณ

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

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

บทเรียน “จัดการข้อมูลซ้อนกัน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “จัดการข้อมูลซ้อนกัน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “จัดการข้อมูลซ้อนกัน”

ทำงานกับโครงสร้างซับซ้อน คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “จัดการข้อมูลซ้อนกัน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. เหตุใดจึงใช้ JSON
  2. ถอดรหัส JSON เป็นตาราง
  3. เข้ารหัสตารางเป็น JSON
  4. จัดการข้อมูลซ้อนกัน
← กลับไปที่ Lua Academy