3 คะแนน โดย GN⁺ 2024-03-20 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • jnv เป็นเครื่องมือที่สร้างขึ้นเพื่อสำรวจ JSON โดยมีทั้งตัวดู JSON แบบอินเทอร์แอคทีฟและตัวแก้ไขตัวกรอง jq
  • การใช้ตัวกรองใช้ jaq ดังนั้นผู้ใช้ไม่จำเป็นต้องเตรียม jq แยกต่างหาก
  • อินพุตรองรับทั้งไฟล์และ stdin และสามารถจัดการได้ไม่เพียง JSON เดี่ยว แต่ยังรวมถึงโครงสร้าง JSON หลายรายการ เช่น JSON Lines ที่สามารถดีซีเรียลไลซ์ด้วย StreamDeserializer ได้
  • สามารถปรับการแสดง hint, การตอบสนองของ UI, พฤติกรรมของตัวแก้ไข, สไตล์ของตัวดู JSON, การแสดงผลและพฤติกรรมของ autocomplete รวมถึง key binding ได้ผ่านการตั้งค่า TOML
  • autocomplete รองรับเฉพาะฟีเจอร์ของ jq อย่าง Identity, Object Identifier-Index, และ Array Index เท่านั้น และแม้ไวยากรณ์การตั้งค่า TOML จะเปลี่ยนไปใน v0.7.0 แต่ไม่มีเครื่องมือ migration ให้

ฟีเจอร์ที่ jnv มีให้

  • jnv เป็นเครื่องมืออินเทอร์แอคทีฟสำหรับสำรวจ JSON และมีตัวดู JSON กับตัวแก้ไขตัวกรอง jq
  • สามารถใช้ syntax highlighting กับ JSON ได้
  • การใช้ตัวกรอง jq ใช้ jaq
    • ผู้ใช้ไม่จำเป็นต้องเตรียม jq ด้วยตนเอง
  • ได้แรงบันดาลใจจาก jid และ jiq

รูปแบบอินพุตและการแก้ไขตัวกรอง

  • รับอินพุตได้จาก ไฟล์ หรือ stdin
  • ข้อมูลรับได้ทั้ง JSON เดี่ยวหรือโครงสร้าง JSON หลายรายการ
    • โครงสร้าง JSON หลายรายการต้องอยู่ในรูปแบบที่สามารถดีซีเรียลไลซ์ด้วย StreamDeserializer ได้
    • ตัวอย่างรวมถึง JSON Lines
  • รองรับ autocomplete ของตัวกรองแบบจำกัด
  • สามารถแสดง ข้อความ hint เพื่อช่วยในการประเมินตัวกรองได้

วิธีติดตั้ง

  • ติดตั้งผ่าน Homebrew ได้
    • brew install jnv
    • หรือ brew install ynqa/tap/jnv
  • ติดตั้งผ่าน MacPorts ได้
    • sudo port install jnv
  • ใช้งานบน Nix / NixOS ได้
    • nix-shell -p jnv
  • ติดตั้งหรือรันผ่านช่องทาง conda-forge ได้
    • pixi global install jnv
    • cat data.json | pixi exec jnv
    • conda install jnv
  • สำหรับ Docker มีตัวอย่างการ build image เองแล้วรัน
    • ระบุว่า image จะมีให้ใช้งานใน registry แห่งใดแห่งหนึ่งในอนาคตอันใกล้
  • ติดตั้งผ่าน Cargo ได้
    • cargo install jnv

ตัวอย่างการใช้งานและตัวเลือก CLI

  • รันได้ด้วยไฟล์หรือ standard input
    • cat data.json | jnv
    • jnv data.json
  • ในสภาพแวดล้อม UNIX สามารถเขียนผลลัพธ์ปัจจุบันไปยัง stdout เมื่อออกจากโปรแกรมได้
    • cat data.json | jnv --write-to-stdout | some-command
    • cat data.json | jnv -- --write-to-stdout > result.json
  • รูปแบบการใช้งานพื้นฐานคือ jnv [OPTIONS] [INPUT]
  • [INPUT] คือพาธไฟล์ JSON แบบไม่บังคับ
    • หากไม่ระบุหรือระบุ - จะอ่านจาก standard input
  • ตัวเลือกหลักมีดังนี้
    • -c, --config <CONFIG_FILE>: ระบุพาธไฟล์ตั้งค่า
    • --default-filter <DEFAULT_FILTER>: ระบุตัวกรอง jq เริ่มต้นที่จะใช้กับข้อมูลอินพุต
    • --write-to-stdout: พิมพ์ผลลัพธ์ JSON ปัจจุบันไปยัง stdout เมื่อออกจากโปรแกรม
    • -h, --help: แสดงข้อความช่วยเหลือ
    • -V, --version: แสดงเวอร์ชัน

การควบคุมด้วยคีย์

  • key binding ทั่วไปมีพฤติกรรมพื้นฐานทั่วทั้งตัวแก้ไขและตัวดู JSON
    • Ctrl + C: ออก
    • Ctrl + Q: คัดลอกตัวกรอง jq ไปยังคลิปบอร์ด
    • Ctrl + O: คัดลอก JSON ไปยังคลิปบอร์ด
    • Shift + ↑, Shift + ↓: สลับไปยังโหมดอื่น
  • Editor mode เป็นโหมดเริ่มต้น
    • Tab: ป้อน suggestion
    • , : เลื่อนเคอร์เซอร์ซ้ายขวา
    • Ctrl + A, Ctrl + E: ไปยังต้นบรรทัดและท้ายบรรทัด
    • Backspace: ลบอักขระก่อนหน้าเคอร์เซอร์
    • Ctrl + U: ลบทั้งบรรทัด
    • Alt + B, Alt + F: เลื่อนไปยังตำแหน่งก่อนหน้าหรือถัดไปโดยอ้างอิงอักขระที่ใกล้ที่สุดในกลุ่ม ., |, (, ), [, ]
    • Ctrl + W, Alt + D: ลบไปจนถึงตำแหน่งก่อนหน้าหรือถัดไปโดยอ้างอิงกลุ่มอักขระเดียวกัน
  • ขณะอยู่ในสถานะ suggestion ของ autocomplete ให้เลือก suggestion ถัดไปด้วย Tab หรือ และเลือก suggestion ก่อนหน้าด้วย
  • JSON viewer mode มีการสำรวจ JSON และควบคุมการพับ
    • , Ctrl + K: เลื่อนขึ้น
    • , Ctrl + J: เลื่อนลง
    • Ctrl + H: ไปยังรายการสุดท้าย
    • Ctrl + L: ไปยังรายการแรก
    • Enter: toggle การพับ
    • Ctrl + P: ขยายทั้งหมด
    • Ctrl + N: พับทั้งหมด

การตั้งค่า TOML

  • jnv ปรับแต่งฟีเจอร์ต่าง ๆ ผ่าน ไฟล์ตั้งค่า TOML
  • ลำดับความสำคัญในการโหลดไฟล์ตั้งค่าคือพาธ -c หรือ --config ที่ระบุบน command line มาก่อน จากนั้นจึงเป็นพาธไฟล์ตั้งค่าเริ่มต้น
  • ตำแหน่งไฟล์ตั้งค่าเริ่มต้นแตกต่างกันตามแพลตฟอร์ม
    • Linux: ~/.config/jnv/config.toml
    • macOS: ~/Library/Application Support/jnv/config.toml
    • Windows: C:\Users\{Username}\AppData\Roaming\jnv\config.toml
  • หากไม่มีไฟล์ตั้งค่า ระบบจะสร้างโดยอัตโนมัติเมื่อรันครั้งแรก
  • ใน v0.7.0 ไวยากรณ์การตั้งค่า TOML เช่น default.toml เปลี่ยนไป และตัวอย่างสะท้อนรูปแบบใหม่แล้ว
    • ไม่มี เครื่องมือ migration สำหรับการเปลี่ยนแปลงนี้
    • ต้องแทนที่หรืออัปเดต config.toml ในเครื่องด้วยตนเองให้ตรงกับไวยากรณ์ใหม่
  • อักขระและสไตล์อาจแสดงผลไม่ถูกต้อง ขึ้นอยู่กับชนิดของเทอร์มินัลและสภาพแวดล้อม
    • key binding บางรายการและอักขระตกแต่งบางตัวอาจไม่แสดงผลหรือทำงานใน terminal emulator บางตัว

รายการตั้งค่าที่ปรับได้

  • สามารถตั้งค่าว่าจะซ่อนข้อความ hint หรือไม่ด้วย no_hint
  • การตั้งค่าตัวแก้ไขสามารถปรับแยกตามสถานะที่โฟกัสและไม่โฟกัสได้
    • โหมดป้อนข้อมูลใช้ Insert และ Overwrite
    • สามารถระบุรายการอักขระขอบเขตของคำเพื่อกำหนดพฤติกรรมการเลื่อนเคอร์เซอร์และการลบได้
    • สามารถระบุอักขระ prefix, สไตล์ prefix, สไตล์อักขระใต้เคอร์เซอร์ และสไตล์อักขระที่เหลือได้
  • การตั้งค่าการแสดง JSON รวมถึง indentation, สไตล์วงเล็บ, สไตล์ key และ value, คุณสมบัติของแถวที่เลือก และวิธีจัดการเมื่อเกินความกว้าง
    • สำหรับอินพุตแบบ stream สามารถจำกัดจำนวนสูงสุดของ JSON object ที่จะประมวลผลด้วย max_streams ได้
    • ค่านี้เป็นการตั้งค่าเพื่อลดการใช้หน่วยความจำเมื่อจัดการ data stream ขนาดใหญ่ และหากไม่ระบุจะไม่มีการจำกัด
  • การตั้งค่า autocomplete ปรับขนาด chunk ของผลการค้นหาและการโหลดเบื้องหลังได้
    • ยิ่งค่ามาก การแสดงผลลัพธ์หรือการโหลดจนเสร็จอาจเร็วขึ้น แต่จะใช้หน่วยความจำมากขึ้น
  • key binding สามารถตั้งค่าแยกตามการออกจากโปรแกรม, การคัดลอก query, การคัดลอกผลลัพธ์, การสลับโหมด, การควบคุมตัวแก้ไข และการควบคุมตัวดู JSON ได้
  • การตั้งค่าการตอบสนองของ UI ปรับความหน่วงในการประมวลผลอินพุต, ความหน่วงในการวาดใหม่หลังเปลี่ยนขนาดหน้าต่าง และช่วงเวลาของแอนิเมชัน spinner ได้

1 ความคิดเห็น

 
GN⁺ 2024-03-20
ความคิดเห็นจาก Hacker News
  • เจ๋งดี ข้อติเล็ก ๆ คือแม้กับ JSON ขนาดกลาง (16MB) ก็ยังช้ามาก และสีฟอนต์มืดเกินไป (ส่ง PR ไปแล้ว)
    ระหว่างมองหาทางเลือกที่ประสิทธิภาพดี เจอ fx(https://fx.wtf) ซึ่งไม่มีฟีเจอร์ jq แต่เป็นตัวดู JSON ที่เร็ว

    • ถ้าตามที่บอกว่า “JSON 16MB ก็ยังช้ามาก” งั้น aqny ที่แวะมาดูเล่น ๆ ก็คงเจองานให้ทำแล้ว การจัดการปัญหาด้านประสิทธิภาพนี่สนุกที่สุด
    • ที่บริษัทต้องจัดการไฟล์ JSON ขนาด 50MB ขึ้นไป ถ้า jnv รองรับระดับนั้นได้ก็คงดีมาก
  • ดูเจ๋งดี สิ่งที่รู้สึกอึดอัดกับ jq มาตลอดคือ ก่อนรันจะไม่เห็นว่าตัวเองกำลังจะดึงข้อมูลอะไรออกมา

    • เครื่องมือนี้น่าจะช่วยดูโครงสร้างข้อมูลได้ และมีประโยชน์ในการค่อย ๆ ไล่ไปหาค่าที่ต้องการ
      https://github.com/TomConlin/json_to_paths
  • คาดหวังมาก ต้องลองดูแน่นอน
    จนถึงตอนนี้ใช้ jq คู่กับ up [0] สำหรับคิวรีแบบโต้ตอบ แต่ไม่ค่อยชอบประสบการณ์ใช้งานของ up โดยเฉพาะเวลาคิวรียาว ๆ หรือมี ข้อมูลที่ไม่ใช่ ASCII มันไม่สะดวก เลยอยากหาทางเลือกอื่น
    [0]: https://github.com/akavel/up

  • ดีมาก คิดว่าจะติดตั้งทันทีที่ได้จับแล็ปท็อป
    เคยทำอะไรคล้าย ๆ กันมาก่อน เลยโดนโพสต์นี้ดึงดูดทันที
    https://github.com/bigH/interactively.git
    คิดว่าน่าจะทำไอเดียนี้ให้ทั่วไปกว่านี้ แล้วเพิ่ม อินเทอร์เฟซแบบโต้ตอบ ให้กับคำสั่งอื่น ๆ ใน CLI ได้มากขึ้น ผมจินตนาการถึง “ตัวสร้างคำสั่ง” มานานแล้ว ที่จะโหลดเอกสารที่เหมาะสมตามตำแหน่งเคอร์เซอร์ และแสดงให้เห็นระหว่างแก้ไขบรรทัดคำสั่ง

  • เจ๋งมาก ไม่รู้ว่าจะขอมากไปไหม แต่อยากรู้ว่าจะปรับให้ทำงานกับ OjG ที่ใช้ JSONPath แทนไวยากรณ์ jq ได้ไหม ถ้าโอเคก็ยินดีช่วย

  • ดูดีเลย ดูค่อนข้างใกล้กับ jless(https://github.com/PaulJuliusMartinez/jless)

    • jless ดูเหมือนจะไม่ได้คัดลอกผลลัพธ์เป็น คิวรี jq ให้
  • อยากให้ทุกคนรู้จัก fx เป็นอีกทางเลือกด้วย
    ทำอะไรอย่าง map, filter, reduce ได้มากกว่าเยอะ และ semantics ก็ใกล้เคียงกับสิ่งที่คุ้นเคยอยู่แล้วมากกว่า รองรับ YAML ด้วย
    https://fx.wtf/getting-started

  • ระหว่างหาเครื่องมือสำหรับกรองและดูไฟล์ล็อก JSONL แบบไดนามิก ก็ได้มาใช้ VisiData
    ถ้าต้องจัดการ JSONL (JSON Lines) ขอแนะนำอย่างยิ่ง

  • คิดว่าสิ่งนี้น่าจะทำได้ด้วย fzf อย่างเดียวหรือเปล่า

  • ถ้าใช้ Sublime Text ก็มี ปลั๊กอิน ที่ทำสิ่งเดียวกันได้ [0]
    ขอบอกไว้ว่าปลั๊กอินนี้ผมเคยทำเอง
    [0]: https://packagecontrol.io/packages/Jq