Blacksmoke16/oq
{ "createdAt": "2019-06-29T02:41:53Z", "defaultBranch": "master", "description": "A performant, and portable jq wrapper to facilitate the consumption and output of formats other than JSON; using jq filters to transform the data.", "fullName": "Blacksmoke16/oq", "homepage": "https://blacksmoke16.github.io/oq/", "language": "Crystal", "name": "oq", "pushedAt": "2025-09-01T14:07:53Z", "stargazersCount": 201, "topics": [ "cli", "crystal", "devops-tools", "jq", "json", "portable", "xml", "yaml" ], "updatedAt": "2025-10-28T14:03:59Z", "url": "https://github.com/Blacksmoke16/oq"}A performant, portable jq wrapper that facilitates the consumption and output of formats other than JSON; using jq filters to transform the data.
- Compiles to a single binary for easy portability.
- Performant, similar performance with JSON data compared to
jq. Slightly longer execution time when going to/from a non-JSON format. - Supports various other input/output formats, such as
XMLandYAML. - Can be used as a dependency within other Crystal projects.
Installation
Section titled “Installation”A statically linked binary for Linux x86_64 as available on the Releases tab. Additionally it can also be installed via various package managers.
Snapcraft
Section titled “Snapcraft”For more on installing & using snap with your Linux distribution, see the official documentation.
sudo snap install oqArch Linux
Section titled “Arch Linux”Using yay:
yay -S oqA pre-compiled version is also available:
yay -S oq-binbrew install oqFrom Source
Section titled “From Source”If building from source, jq will need to be installed separately. Installation instructions can be found in the official documentation.
Requires Crystal to be installed, see the installation documentation.
git clone https://github.com/Blacksmoke16/oq.gitcd oq/shards build --production --releaseThe built binary will be available as ./bin/oq. This can be relocated elsewhere on your machine; be sure it is in your PATH to access it as oq.
Docker
Section titled “Docker”oq can easily be included into a Docker image by fetching the static binary from Github for the version of oq that you want.
# Set an arg to store the oq version that should be installed.ARG OQ_VERSION=1.3.5
# Grab the binary from the latest Github release and make it executable; placing it within /usr/local/bin. Can also put it elsewhere if you so desire.RUN wget https://github.com/Blacksmoke16/oq/releases/download/v${OQ_VERSION}/oq-v${OQ_VERSION}-linux-x86_64 -O /usr/local/bin/oq && chmod +x /usr/local/bin/oq
# Or using curl (needs to follow Github's redirect):RUN curl -L -o /usr/local/bin/oq https://github.com/Blacksmoke16/oq/releases/download/v${OQ_VERSION}/oq-v${OQ_VERSION}-linux-x86_64 && chmod +x /usr/local/bin/oq
# Also be sure to install jq if it is not already!Existing Crystal Project
Section titled “Existing Crystal Project”Add the following to your shard.yml and run shards install.
dependencies: oq: github: blacksmoke16/oq version: ~> 1.3.0Use the oq binary, with a few optional custom arguments, see oq --help. All other arguments get passed to jq. See jq manual for details.
Library
Section titled “Library”Checkout the API Documentation for using oq within an existing Crystal project.
Examples
Section titled “Examples”Consume JSON and output XML
$ echo '{"name": "Jim"}' | oq -o xml .<?xml version="1.0" encoding="UTF-8"?><root> <name>Jim</name></root>Consume YAML from a file and output XML
data.yaml
---name: Jimnumbers: - 1 - 2 - 3$ oq -i yaml -o xml . data.yaml<?xml version="1.0" encoding="UTF-8"?><root> <name>Jim</name> <numbers>1</numbers> <numbers>2</numbers> <numbers>3</numbers></root>Use oq as a library, consuming some raw JSON input, convert it to YAML, and write the transformed data to a file.
require "oq"
# This could be any `IO`, e.g. an `HTTP` request body, etc.input_io = IO::Memory.new %({"name":"Jim"})
# Create a processor, specifying that we want the output format to be `YAML`.processor = OQ::Processor.new output_format: :yaml
File.open("./out.yml", "w") do |file| # Process the data using our custom input and output IOs. # The first argument represents the input arguments; # i.e. the filter and/or any other arguments that should be passed to `jq`. processor.process ["."], input: input_io, output: fileendContributing
Section titled “Contributing”- Fork it (https://github.com/Blacksmoke16/oq/fork)
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create a new Pull Request
Contributors
Section titled “Contributors”- George Dietrich - creator, maintainer
- Michael Springer - contributor