Show HN: jnv: ตัวกรอง JSON แบบอินเทอร์แอคทีฟที่ใช้ jq
(github.com/ynqa)- 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 jnvcat data.json | pixi exec jnvconda install jnv
- สำหรับ Docker มีตัวอย่างการ build image เองแล้วรัน
- ระบุว่า image จะมีให้ใช้งานใน registry แห่งใดแห่งหนึ่งในอนาคตอันใกล้
- ติดตั้งผ่าน Cargo ได้
cargo install jnv
ตัวอย่างการใช้งานและตัวเลือก CLI
- รันได้ด้วยไฟล์หรือ standard input
cat data.json | jnvjnv data.json
- ในสภาพแวดล้อม UNIX สามารถเขียนผลลัพธ์ปัจจุบันไปยัง stdout เมื่อออกจากโปรแกรมได้
cat data.json | jnv --write-to-stdout | some-commandcat 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
- Linux:
- หากไม่มีไฟล์ตั้งค่า ระบบจะสร้างโดยอัตโนมัติเมื่อรันครั้งแรก
- ใน 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 ขนาดใหญ่ และหากไม่ระบุจะไม่มีการจำกัด
- สำหรับอินพุตแบบ stream สามารถจำกัดจำนวนสูงสุดของ JSON object ที่จะประมวลผลด้วย
- การตั้งค่า autocomplete ปรับขนาด chunk ของผลการค้นหาและการโหลดเบื้องหลังได้
- ยิ่งค่ามาก การแสดงผลลัพธ์หรือการโหลดจนเสร็จอาจเร็วขึ้น แต่จะใช้หน่วยความจำมากขึ้น
- key binding สามารถตั้งค่าแยกตามการออกจากโปรแกรม, การคัดลอก query, การคัดลอกผลลัพธ์, การสลับโหมด, การควบคุมตัวแก้ไข และการควบคุมตัวดู JSON ได้
- การตั้งค่าการตอบสนองของ UI ปรับความหน่วงในการประมวลผลอินพุต, ความหน่วงในการวาดใหม่หลังเปลี่ยนขนาดหน้าต่าง และช่วงเวลาของแอนิเมชัน spinner ได้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
เจ๋งดี ข้อติเล็ก ๆ คือแม้กับ JSON ขนาดกลาง (16MB) ก็ยังช้ามาก และสีฟอนต์มืดเกินไป (ส่ง PR ไปแล้ว)
ระหว่างมองหาทางเลือกที่ประสิทธิภาพดี เจอ fx(https://fx.wtf) ซึ่งไม่มีฟีเจอร์ jq แต่เป็นตัวดู JSON ที่เร็ว
ดูเจ๋งดี สิ่งที่รู้สึกอึดอัดกับ 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)
อยากให้ทุกคนรู้จัก fx เป็นอีกทางเลือกด้วย
ทำอะไรอย่าง
map,filter,reduceได้มากกว่าเยอะ และ semantics ก็ใกล้เคียงกับสิ่งที่คุ้นเคยอยู่แล้วมากกว่า รองรับ YAML ด้วยhttps://fx.wtf/getting-started
ระหว่างหาเครื่องมือสำหรับกรองและดูไฟล์ล็อก JSONL แบบไดนามิก ก็ได้มาใช้ VisiData
ถ้าต้องจัดการ JSONL (JSON Lines) ขอแนะนำอย่างยิ่ง
คิดว่าสิ่งนี้น่าจะทำได้ด้วย fzf อย่างเดียวหรือเปล่า
[0]: https://dev.to/pbnj/fzf-jq-interactive-jq-15no
เดโม: https://asciinema.org/a/349330
ถ้าใช้ Sublime Text ก็มี ปลั๊กอิน ที่ทำสิ่งเดียวกันได้ [0]
ขอบอกไว้ว่าปลั๊กอินนี้ผมเคยทำเอง
[0]: https://packagecontrol.io/packages/Jq