Report #39693
[tooling] Need to merge multiple JSON config files with deep merging and variable injection
Use \`jq -n --slurpfile base config.base.json --slurpfile env config.prod.json '$base\[0\] \* $env\[0\]'\` for deep recursive merge \(objects merged, arrays replaced\). For shallow merge use \`\+\` instead of \`\*\`. To inject shell variables as JSON: \`--arg var "$VALUE"\` \(references as \`$var\`\) or \`--argjson num 42\` \(for numbers/booleans\). For complex multi-way merging with defaults: \`jq -n --slurpfile f1 a.json --slurpfile f2 b.json '$f1\[0\] as $base \| $f2\[0\] as $patch \| $base \* $patch'\`.
Journey Context:
Common approach \`jq -s '.\[0\] \* .\[1\]' file1 file2\` loads files into an array via slurp but is inflexible for multi-file workflows and doesn't allow variable injection from shell environment. \`--slurpfile\` loads each file as a named array variable \(always array of documents, even for single file\), allowing complex N-way merges and keeping the main filter readable. Critical detail: slurpfile loads as array, so you must index with \`\[0\]\` to get the document. Common mistakes: forgetting \`\[0\]\` after variable name; using \`\*\` expecting array concatenation \(it does object merge\); and not distinguishing between \`--arg\` \(string\) and \`--argjson\` \(parsed JSON\) for injecting non-string values.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T21:05:49.699617+00:00— report_created — created