7 ms·
Fx – Terminal JSON Viewer
- medv 3y agoHey HN friends! I've taken `fx` back to the drawing board and completely rewritten it from the ground up. Excited to share what's new: 1. *Going Big*: `fx` now gracefully handles even the most massive JSON files. 2. *A New TUI Look*: Dive deep into your data with a revamped terminal interface—now with themes! 3. *Swift Navigation with Dig Fuzzy Search*: Feeling lost in JSON? Just type `.` and navigate with ease. 4. *Powerful Regex Search*: Scan across your entire JSON content with precision. 5. *Elegant Long String Wraps*: No more cut-offs. Your strings wrap beautifully now. 6. *All Things JSON*: Added love for comments, trailing commas, and JSON streams. Pouring my heart and soul into this rewrite has been a journey to make `fx` faster and more powerful. If you find value in what I've crafted and want to support its future, consider sponsoring on GitHub. Would love to hear your thoughts and feedback!
- verdverm 3y agoWhat can you do with the JSON in the TUI? Anything besides looking at it? (https://fx.wtf/getting-started#json-processing https://fx.wtf/getting-started#json-processing but from the TUI?) Built something similar, but with love for all things CUE (also works for JSON/Yaml) (https://youtu.be/XNBqBWO4y08 https://youtu.be/XNBqBWO4y08) Yours looks to have a better object navigation, I might have to be inspired by it! How do you like Bubbletea? We went with tcell/tview (fork) for more control of the UI & event handling
- matthewtse 3y agowow nice, I'll give this a try. I've always used jq for viewing json, but it's the wrong tool for my use. I basically want to explore json interactively, not parse it specifically. So the workflow is to keep "jq"ing it, and modifying my jq query until I find what I'm looking for. Your tool looks like it allows interactive exploration.
- nanny 3y agoYou may be interested in an interactive jq tool like jiq or others: https://github.com/fiatjaf/awesome-jq https://github.com/fiatjaf/awesome-jq (do a ctrl-f for "interactive" on this page).
- anonymoushn 3y agoHello, Is there a commonly-used grammar for "json with comments and trailing commas" or does everyone just try to copy the jsonc from vscode?
- verdverm 3y agoIt's basically https://json5.org/ https://json5.org/ CUE will happily take your JSON with comments and extra commas, or no commas too (lists still need them), most keys can be unquoted, and it's just a one-liner to get valid json or yaml from it
- IshKebab 3y agoJsonnet does too I believe. I wanted to like Cue but it only works with Go and it doesn't actually let you link the schemas you write from the "document" files, which means no automatic schema checking and no IDE support. Giving up two huge benefits of having a schema in the first place.
- verdverm 3y agoI'm not sure what you mean about the schema / documents thing. Can you elaborate? I've not had problems "linking" (?) data and schemas. I'd guess the lack of documentation is more to blame here. CUE is most often used as a CLI, so no Go is needed, that's really for advanced cases. Being Go, you can compile to SO or WASM, so can use it from pretty much any language. The lack of LSP is being actively worked on right now, I'm hoping they'll have something before the year is out
- IshKebab 3y agoIn an XML document you can specify the XML schema location with `xsi:schemaLocation`. In a JSON document you can specify the JSON Schema location with `$schema`. In a Cue document how do you specify the location of the Cue schema? As far as I can tell you can't. And yes I am aware that the concept of a "document" and a "schema" are basically merged in Cue, but that doesn't mean I don't want to do this. > CUE is most often used as a CLI, so no Go is needed Only because that's the only way you can use it. > Being Go, you can compile to SO or WASM Compiling to a shared library is awkward because you then need to have the Go toolchain installed. WASM might be an option ... I couldn't find out how Go actually works in WASM though given that it needs a GC and threads, and WASM currently has neither. Do they ship their own WASM GC? Either way, it's of no practical use since nobody has actually done that. Look at the languages supported by Jsonnet for comparison: https://jsonnet.org/ref/bindings.html https://jsonnet.org/ref/bindings.html Python, C, Rust (twice), Go (twice), Lua, Node, PHP, Ruby, Haskell. If I'm loading a config file from Python I don't want to have to mess around with `subprocess.run()` to read it. It's a solvable problem... but today, it's a bit of a turn-off.
- etdr 3y agoI am probably missing something but is interactive mode not a flag? Is it just what happens with a longer JSON automatically?
- albybisy 3y agohow do you use the Built-in Functions? i tried them but it gives me error every time
- tpmx 3y agoSome feedback: - Some indication of how far down you've scrolled would be useful for "situational awareness". Perhaps a percentage number in the status bar (like emacs/vim?) - I miss not having the Home/End keys bound to the goto top/bottom actions - The cursor behavior when pressing PageDn/PageUp throws me off. Emacs when pressing PageDn: Cursor ends up at the top of the window. Vim: Cursor stays at the current position. notepad.exe: Cursor ends up in the middle of the window. Fx: Cursor ends up at the bottom of the window. - The . navigation is very neat with the tab completion. Probably stupid observation: If you remove the alphabet key shortcuts you wouldn't need the (non-discoverable) dot. :)
- medv 3y agoThanks for the feedback. Will try to address it in future releases. Yes pgdown behaviour need to be refactored. Home/end is easy to add. > If you remove the alphabet key shortcuts you wouldn't need the (non-discoverable) dot. :) I did not get this one.
- sigg3 3y agoThis looks really nice, well done! I never could get used to jq's syntax so instead I've just been grepping. But this looks to be for jq what htop is to top, which is great for exploring response data.
- jbverschoor 3y agoWhy not call it Jim? JSON vim
- Daeraxa 3y agoNeed to have a bit more of a play with it but I really like it so far. I mainly see myself using it to pipe into (like from curl or the gh cli). One thing that isn't clear to me is how to actually use the themes you can display with fx --themes.
- medv 3y agoWill update the docs. But it is easy: FX_THEME=2 fx data.json
- replwoacause 3y agoThis looks really nice.
- swah 3y agoAny comparison to jless?
- verdverm 3y agofx looks to work from the command line (without viewing) to do more than just inspect, looks like you can do pretty much anything to it with a bit of JS, though not from the TUI afaict There are many JSON viewers, I would think that inspecting with collapsable sections ought to be right in VS Code with LSP/treesitter, no extra tools needed. What's more interesting to me is what can you do with the JSON in these tools, validate, filter, transform, chain...?
- jspeaks 3y agoHaving used https://jqlang.github.io/jq/ https://jqlang.github.io/jq/, wondering your pitch on advantages, alternative use cases for using fx?
- deleted 3y ago[deleted]
- tetris11 3y agoNot OP but echo '{"name": "world"}' | fx 'x => x.name' 'x => `Hello, ${x}!`' Is immediately grokkable compared to jq's syntax. I love jq, I think it's extremely powerful, but I have to load up the documentation in a side window every time I have use it.
- jq_foo 3y agoEquivalent jq seems okay here: echo '{"name": "world"}' | jq '"Hello \(.name)"'
- medv 3y agoYes and both can be expressed in js and jq. Poinjt is what JS is known by much more peopel. As fx uses Node or Deno we for example can use lodash in fx: fx '_.groupBy("commit.author.name")' '_.mapValues(size)' '_.toPairs' '_.sortBy(1)' '_.reverse' '_.take(10)' '_.fromPairs' To do if in jq, it will take me much more time and extensive documentation reading.
- gcr 3y agoWhat’s the original JSON? Happy to try and express this in jq
- maleldil 3y agoLooks like the GitHub API: https://docs.github.com/en/free-pro-team@latest/rest/commits/commits?apiVersion=2022-11-28#list-commits https://docs.github.com/en/free-pro-team@latest/rest/commits... I'm looking forward to your jq version. I love jq and use it all the time, but for anything of that complexity, I'd probably just use Python.
- ivanche 3y agoWould've been awesome if results are displayed under the commands. For example, command echo '{"name": "hello"}\n{"name": "world"}' | fx '.name' would output what? My guess is hello world but it might be hello\nworld.
- fodkodrasz 3y agoit is written in Go. What does it have to do with npx/npm at all? Did I miss something about these tools?
- toastercat 3y agoWhere do you see npm/npx mentioned?
- fodkodrasz 3y agoat https://fx.wtf/getting-started https://fx.wtf/getting-started it says: $ cat file.json | npx fx .field
- laurent123456 3y agoIt seems it would work since they release an npm package too: https://www.npmjs.com/package/fx https://www.npmjs.com/package/fx A bit surprising, I wonder if they implemented it in JS too, or somehow managed to distribute their Go program on npm. Edit: They indeed have a separate non-interactive version in JS: https://github.com/antonmedv/fx/tree/master/npm https://github.com/antonmedv/fx/tree/master/npm
- nwsm 3y agoThe project supports JS scripts as arguments to process the data: https://fx.wtf/getting-started#json-processing https://fx.wtf/getting-started#json-processing It's hard to tell from the docs if there is any JS involved if you just pipe JSON data to fx. I would hope not, since it mentions being written in Go for performance.
- freedomben 3y agoThis is what I was wondering as well. Is there an interpreter built into the go binary? or is it using my node install under the hood? Edit: Answered my own question. I installed it into a podman container with nothing else in it, and it printed this when trying to execute js: Node.js or Deno is required to run fx with reducers.
- nathell 3y agoThe other day, I found myself in need of visualising a tree of paths, like this: /one/two /one/three/four /one/three/five /six I ended up converting it to a JSON with a one-off Python script, and then using fx for the viewing. It worked very well! Thank you for the tool! (Incidentally, I’ve been writing my own viewer [0] to satisfy my original need more straightforwardly, but that’s still in very early stages.) [0]: https://github.com/nathell/treeviewer https://github.com/nathell/treeviewer
- js2 3y agoAs in filesystem paths? Are you aware of `tree`? https://en.wikipedia.org/wiki/Tree_(command) https://en.wikipedia.org/wiki/Tree_(command)
- nathell 3y agoNot necessarily filesystem paths (in my case, the paths correspond to RocksDB keys). And I’d like to be able to fold/unfold subtrees, search within node names, and call arbitrary commands for a given path in the tree, from within a TUI. So no, `tree` won’t cut it.
- lionkor 3y ago> Built using the Go programming language for efficient performance. Do you mean to say "efficiency" or "performance"? I dont see both working like that
- nanny 3y agoIt's correct as it is. Performance can be good or bad. "...for efficiency" would be correct, but if they were to write only "...for performance" it would missing a qualifier.
- meatjuice 3y agoThis could be done with nushell. https://www.nushell.sh/commands/docs/from_json.html https://www.nushell.sh/commands/docs/from_json.html
- jasonjmcghee 3y agoIs the output ascii diagram only? Seems like a pretty different use case
- two_handfuls 3y agoNo the output is a table object, you can apply other operations to it like sort, etc. the shell displays them in this ascii art way at the end but you can also write to files in various formats.
- al_be_back 3y agosure can do, if you already use that shell [1], but personally I like specific tools for specific jobs such as jq [2], fx, csvq [3] etc, there's value in decoupling shells from utils (modularity, speed, innovation etc). [1] I don't but tempted to try, like its data-types concept [2] https://jqlang.github.io/jq/ https://jqlang.github.io/jq/ [3] https://github.com/mithrandie/csvq https://github.com/mithrandie/csvq
- montroser 3y agoVery cool. Not a huuge deal, but for open source software, I don't totally appreciate the http call to a bitly tracker in the install script...
- umvi 3y agoJust use: go install github.com/antonmedv/fx@latest
- who-shot-jr 3y agoLooks great! What is the website https://fx.wtf/ https://fx.wtf/ built-in?
- moelf 3y agoVue
- parhamn 3y ago> In fx, arguments are treated as JavaScript functions. Input data is passed sequentially through each provided function. > echo '{"name": "world"}' | fx 'x => x.name' 'x => `Hello, ${x}!`' Wow, that is so nice. Having to memorize JQ syntax is such a pain.
- dpedu 3y agoPretty cool! I actually wrote something VERY similar a couple of years ago: sless[1]. It's a tool for viewing json-based structured logs. Just like your tool, you can explore into a json object. The difference is, it expects the input to have many json objects, newline separated, and it shows few keys as a preview of the object, to make looking for something in the log easier. It's not quite complete but basic browsing works. It was mainly written to learn more about Urwid[2], a library similar to Curses. 1: https://github.com/dpedu2/sless https://github.com/dpedu2/sless 2: https://urwid.org/ https://urwid.org/
- JohnMakin 3y agocould've used this a few years ago before jq became so second nature, cool
- cwaffles 3y agoI find `gron` to be very helpful for generating jq query strings https://github.com/tomnomnom/gron https://github.com/tomnomnom/gron
- madspindel 3y agoFYI: .wtf top domain is blocked in HaGeZi's The World's Most Abused TLDs: https://raw.githubusercontent.com/hagezi/dns-blocklists/main/adblock/spam-tlds.txt https://raw.githubusercontent.com/hagezi/dns-blocklists/main... Might wanna change to something else.
- nikolay 3y agoIt is nice for PCs, but requiring Node.js limits its use on servers.
- _def 3y agoamazing! Does someone know something like this for yaml? (does not have to be cli)
- gavanwilhite 3y agoSomething that would be extra awesome would be light markdown support inside fields. This would make it useful for reviewing chatbot conversations.
- tinix 3y agovisidata anyone?
- leonim 3y agoThis fx rewrite is very exciting. I'll have to try it. I thought of fx as a wrapper around jq, that allowed quick iteration over building jq scripts. Sort of an Ultimate Plumber [1] but only for jq. It looks like it is now more like a JavaScript processor plus an interactive viewer. Someone mention Visidata[2]? VisiData is also a TUI that is great on tabular data, and it can work with json. If your JSON is mostly tabular in nature, Visidata does a great job at showing that data and allowing you to explore it. A lot of json I deal with is tabular-like data. There is a great tutorial [3], that can help you get your bearings with Visidata. Once you understand those basics you might want to look at this thread [4] for what commands you can use with json. [1] Ultimate Plumber: https://github.com/akavel/up https://github.com/akavel/up [2] Visidata: https://github.com/saulpw/visidata https://github.com/saulpw/visidata [3] "Intro to VisiData Tutorial": https://jsvine.github.io/intro-to-visidata/ https://jsvine.github.io/intro-to-visidata/ by Jeremy Singer-Vine [4] "Is it possible to "flatten" structured data (like JSON?)": https://github.com/saulpw/visidata/discussions/1605 https://github.com/saulpw/visidata/discussions/1605