แฟลตเทน JSON

ตัวคั่น:
ความลึกสูงสุด:(0=unlimited)

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

คำแนะนำที่เกี่ยวข้อง

กรณีการใช้งาน

  • Query และ update ใน MongoDB: ใช้คีย์แบบจุดแทนการพิมพ์เส้นทางซ้อนด้วยตัวเอง
  • ส่งออกเป็น CSV และ Excel: แปลง JSON หลายชั้นให้เป็นคอลัมน์แบบแบนสำหรับงานตาราง
  • เตรียมข้อมูลสำหรับ Elasticsearch: ลดความซับซ้อนของเอกสารที่ซ้อนลึกก่อนทำดัชนี
  • ดีบัก API: เปรียบเทียบฟิลด์ของ request และ response ในมุมมองคีย์แบบแบนเดียวกัน
  • เตรียมไฟล์ตั้งค่าและตัวแปรสภาพแวดล้อม: คลี่ค่าที่ซ้อนอยู่ใน package.json หรือ settings.json

วิธีการใช้งาน

  1. วาง JSON ลงในช่องด้านซ้ายหรืออัปโหลดไฟล์ .json จากเครื่อง
  2. เลือกโหมด flatten หรือ unflatten แล้วตั้งค่าตัวคั่น การจัดการอาร์เรย์ และความลึกสูงสุด
  3. ดูผลลัพธ์ที่ด้านขวาพร้อมจำนวนคีย์และสถิติความลึก
  4. คัดลอกผลลัพธ์หรือดาวน์โหลดเป็นไฟล์ .json

คุณสมบัติ

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

ตัวอย่างโค้ด

แฟลตเทน JSON ด้วย JavaScript

javascript
function flatten(obj, prefix = '', sep = '.') {
  return Object.entries(obj).reduce((acc, [key, value]) => {
    const newKey = prefix ? `${prefix}${sep}${key}` : key;
    if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
      Object.assign(acc, flatten(value, newKey, sep));
    } else {
      acc[newKey] = value;
    }
    return acc;
  }, {});
}

flatten({ user: { name: 'Alice', contact: { email: 'a@x.com' } } });
// => { 'user.name': 'Alice', 'user.contact.email': 'a@x.com' }

แฟลตเทน JSON ด้วย Python

python
def flatten(obj, parent_key='', sep='.'):
    items = {}
    for key, value in obj.items():
        new_key = f"{parent_key}{sep}{key}" if parent_key else key
        if isinstance(value, dict):
            items.update(flatten(value, new_key, sep))
        else:
            items[new_key] = value
    return items

import json
print(json.dumps(flatten({'user': {'name': 'Alice'}}), indent=2))
# => {"user.name": "Alice"}

แฟลตเทน JSON ด้วย jq บน command line

bash
# แปลง JSON ที่ซ้อนกันให้เป็นโครงสร้างแบนด้วยคีย์คั่นด้วยจุด
jq '[paths(scalars) as $p | {"key": $p | join("."), "value": getpath($p)}] | from_entries' data.json

# กู้คืน JSON แบบแบนให้กลับเป็นโครงสร้างซ้อน
# ใช้ jq 1.7+ ร่วมกับฟิลเตอร์ภายนอก หรือใช้โหมด unflatten ของเครื่องมือนี้

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

แฟลตเทน JSON คืออะไร และควรใช้เมื่อไร?

การแฟลตเทน JSON คือการแปลง object และ array ที่ซ้อนกันให้เป็นคู่คีย์-ค่าแบบชั้นเดียว เหมาะกับการทำ query ใน MongoDB, ส่งออก CSV, สร้างดัชนี Elasticsearch, ตั้งค่าตัวแปรสภาพแวดล้อม และเปรียบเทียบฟิลด์ของ API

JSON ที่แฟลตแล้วสามารถกู้คืนเป็นโครงสร้างเดิมได้หรือไม่?

ได้ หากใช้ตัวคั่นเดียวกัน เครื่องมือจะประกอบคีย์แบบแบนกลับเป็น object และ array เดิม โดยคีย์ตัวเลขต่อเนื่องจะถูกมองเป็นอาร์เรย์โดยอัตโนมัติ

เปลี่ยนตัวคั่นและวิธีจัดการอาร์เรย์ได้ไหม?

ได้ คุณสามารถใช้จุด ขีดล่าง สแลช ขีดล่างคู่ หรือกำหนดตัวคั่นเองก็ได้ และเลือกได้ว่าจะขยายอาร์เรย์เป็น `items.0`, `items.1` หรือเก็บทั้งอาร์เรย์ไว้เป็นค่าเดียว

ประมวลผล JSON ออนไลน์ปลอดภัยหรือไม่?

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

จะใช้ผลลัพธ์กับ MongoDB อย่างไร?

MongoDB อ้างถึงฟิลด์ที่ซ้อนกันด้วยเส้นทางแบบจุด คีย์ที่ได้จากเครื่องมือนี้จึงนำไปใช้กับ `find`, `update` และ aggregation pipeline ได้ทันที

ผลลัพธ์เหมาะกับ CSV และ Excel หรือไม่?

เหมาะ หลังจากแฟลตแล้วทุกฟิลด์จะอยู่ในระดับเดียวกัน จึงนำไปต่อกับเครื่องมือ JSON to CSV, Excel หรือ Pandas เป็นคอลัมน์ได้ง่าย

ถ้าคีย์เดิมมีจุดหรือตัวคั่นอยู่แล้วจะเกิดอะไรขึ้น?

อาจทำให้ตอนกู้คืนระบบตีความระดับชั้นผิดได้ ควรเปลี่ยนตัวคั่นหรือ escape คีย์ที่ชนกันก่อนแปลง

เครื่องมือนี้จัดการ JSON ขนาดใหญ่มากได้ไหม?

ไฟล์ตั้งค่าทั่วไปและ response ของ API มักไม่มีปัญหา แต่ถ้า JSON ใหญ่มากควรแบ่งข้อมูลหรือใช้ CLI ในเครื่องอย่าง `jq` เพื่อลดภาระหน่วยความจำของเบราว์เซอร์

การแก้ไขปัญหา

เครื่องมือบอกว่าอินพุตไม่ใช่ JSON ที่ถูกต้อง

มักเกิดจากการขาดเครื่องหมายคำพูด มีจุลภาคเกิน ปิดวงเล็บไม่ครบ หรือใช้ค่าแบบ True/False ก่อนอื่นให้ตรวจไวยากรณ์ด้วยเครื่องมือ format JSON

หลังทำ unflatten แล้วโครงสร้างไม่ตรง

เป็นไปได้ว่าคีย์เดิมมีตัวคั่นที่คุณเลือกอยู่แล้ว ลองเปลี่ยนตัวคั่นหรือ escape คีย์ที่ชนกันก่อนประมวลผล

เมื่อขยายอาร์เรย์แล้ว CSV กว้างเกินไป

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

JSON ขนาดใหญ่ทำให้เบราว์เซอร์ช้า

JSON ขนาดใหญ่มากจะใช้หน่วยความจำสูง ควรแบ่งข้อมูลเป็นส่วนย่อยหรือใช้เครื่องมือในเครื่องอย่าง `jq`, Python หรือ Node.js