{"record":{"id":"b4323da3e867a4d8","repo":"BoundaryML/baml","slug":"mismatched-brackets-multi-json-parser","errorCode":null,"errorMessage":"Mismatched brackets","messagePattern":"Mismatched brackets","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"engine/baml-lib/jsonish/src/jsonish/parser/multi_json_parser.rs","lineNumber":26,"sourceCode":"    let mut stack = Vec::new();\n    let mut json_str_start = None;\n    let mut json_objects = Vec::new();\n\n    for (index, character) in str.char_indices() {\n        match character {\n            '{' | '[' => {\n                if stack.is_empty() {\n                    json_str_start = Some(index);\n                }\n                stack.push(character);\n            }\n            '}' | ']' => {\n                if let Some(last) = stack.last() {\n                    let expected_open = if character == '}' { '{' } else { '[' };\n                    if *last == expected_open {\n                        stack.pop();\n                    } else {\n                        return Err(anyhow::anyhow!(\"Mismatched brackets\"));\n                    }\n                }\n\n                if stack.is_empty() {\n                    let end_index = index + 1;\n                    let json_str = if let Some(start) = json_str_start {\n                        &str[start..end_index]\n                    } else {\n                        &str[..end_index]\n                    };\n                    match entry::parse_func(\n                        json_str,\n                        options.next_from_mode(super::ParsingMode::AllJsonObjects),\n                        false,\n                    ) {\n                        Ok(json) => json_objects.push(json),\n                        Err(e) => {\n                            // Ignore errors","sourceCodeStart":8,"sourceCodeEnd":44,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/engine/baml-lib/jsonish/src/jsonish/parser/multi_json_parser.rs#L8-L44","documentation":"The multi-json parser tracks an opening-bracket stack while scanning; when a closing '}' or ']' does not match the most recent opener on the stack, it returns 'Mismatched brackets'. The input is structurally invalid JSON — brackets are crossed (e.g. '[}') rather than merely unbalanced.","triggerScenarios":"multi_json_parser::parse receiving text where a closer mismatches the top of the stack, e.g. '{...]' or '[...}', or stray closers interleaved across concatenated JSON objects.","commonSituations":"LLM corrupted output by mixing object/array syntax, or template code concatenated JSON fragments incorrectly.","solutions":["Validate the text with a JSON linter to locate the mismatched bracket position","Ask the model to regenerate with strictly valid JSON (response_format json mode where available)","Run the input through the fixing parser, which tolerates some bracket errors","Reject/handle the error upstream rather than attempting to salvage crossed brackets"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"fn brackets_crossed(s: &str) -> bool {\n    let mut stack = Vec::new();\n    for c in s.chars() {\n        match c { '{' | '[' => stack.push(c), '}' | ']' => {\n            let open = if c == '}' { '{' } else { '[' };\n            match stack.pop() { Some(o) if o == open => {} _ => return true }\n        } _ => {} }\n    }\n    false\n}","typeGuard":null,"tryCatchPattern":"match multi_json_parser::parse(text) {\n    Err(e) if e.to_string().contains(\"Mismatched brackets\") => retry_with_json_mode(),\n    other => other,\n}","preventionTips":["Lint extracted JSON before feeding it onward","Use the model provider's native JSON mode when available","Try the fixing parser, which tolerates some malformed brackets"],"tags":["json","syntax","brackets","parsing"],"backgroundTag":"json-parse-error","analyzedSha":"bd85ce9dee1463ff04d27efd20531013a4ff46c1","analyzedAt":"2026-09-12T03:38:25.718Z","contentChangedAt":"2026-09-12T03:38:25.718Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}