This workflow corresponds to n8n.io template #5146 — we link there as the canonical source.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"nodes": [
{
"id": "4fd2662b-6698-4ec2-9b27-97afaa3416c1",
"name": "Robust JSON Parser",
"type": "n8n-nodes-base.executeWorkflowTrigger",
"position": [
-432,
-64
],
"parameters": {
"inputSource": "jsonExample",
"jsonExample": "{\n \"text\": \"{\\\"your\\\": \\\"json to parse goes here\\\"}\"\n}"
},
"typeVersion": 1.1
},
{
"id": "a8e7b7d4-ff0f-4138-8b7e-b01900b1013f",
"name": "Safe JSON Parser",
"type": "n8n-nodes-base.code",
"onError": "continueRegularOutput",
"position": [
272,
-64
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "/**\n * Escapes control characters (like \\n, \\r, \\t) within JSON strings.\n * Ex: Replaces a literal newline in \"hello\\nworld\" with \"hello\\\\nworld\".\n * @param {string} jsonString The string potentially containing unescaped control characters.\n * @returns {string} The corrected string.\n */\nfunction escapeControlCharsInStrings(jsonString) {\n let fixed = \"\";\n let inString = false;\n let escapeNext = false;\n\n for (let i = 0; i < jsonString.length; i++) {\n const char = jsonString[i];\n\n if (escapeNext) {\n fixed += char;\n escapeNext = false;\n continue;\n }\n\n if (char === '\\\\') {\n fixed += '\\\\';\n escapeNext = true;\n continue;\n }\n\n if (char === '\"') {\n fixed += '\"';\n inString = !inString;\n continue;\n }\n\n if (inString) {\n if (char === '\\n') {\n fixed += '\\\\n';\n } else if (char === '\\r') {\n fixed += '\\\\r';\n } else if (char === '\\t') {\n fixed += '\\\\t';\n } else if (char === '\\b') {\n fixed += '\\\\b';\n } else if (char === '\\f') {\n fixed += '\\\\f';\n }\n // Handle other control characters (U+0000 to U+001F)\n // that do not have a short escape sequence.\n else if (char.charCodeAt(0) >= 0 && char.charCodeAt(0) <= 31) {\n let hex = char.charCodeAt(0).toString(16);\n fixed += '\\\\u' + '0000'.substring(hex.length) + hex;\n }\n else {\n fixed += char;\n }\n } else {\n fixed += char;\n }\n }\n return fixed;\n}\n\n\n/**\n * Fixes invalid escape sequences in a potential JSON string\n * by escaping the backslash itself.\n * Ex: Replaces `\\$` with `\\\\$`, `\\: ` with `\\\\:`, but leaves `\\\"` or `\\\\` or `\\n` (if already escaped) intact.\n * @param {string} jsonString The string potentially containing invalid escapes.\n * @returns {string} The corrected string.\n */\nfunction fixInvalidEscapes(jsonString) {\n let fixed = \"\";\n for (let i = 0; i < jsonString.length; i++) {\n if (jsonString[i] === '\\\\') {\n if (i + 1 < jsonString.length) {\n const nextChar = jsonString[i + 1];\n const validEscapeChars = ['\"', '\\\\', '/', 'b', 'f', 'n', 'r', 't'];\n\n if (validEscapeChars.includes(nextChar)) {\n fixed += '\\\\' + nextChar;\n i++;\n } else if (nextChar === 'u') {\n if (i + 5 < jsonString.length && /^[0-9a-fA-F]{4}$/.test(jsonString.substring(i + 2, i + 6))) {\n fixed += '\\\\u' + jsonString.substring(i + 2, i + 6);\n i += 5;\n } else {\n fixed += '\\\\\\\\u';\n i++;\n }\n } else {\n fixed += '\\\\\\\\' + nextChar;\n i++;\n }\n } else {\n fixed += '\\\\\\\\';\n }\n } else {\n fixed += jsonString[i];\n }\n }\n return fixed;\n}\n\n/**\n * Attempts to parse a JSON string. Returns the object/array or null on error.\n * Also captures the error message with context.\n * @param {string} jsonString The string to parse.\n * @returns {{ data: object | Array | null, error: string | null }} Parsing result.\n */\nfunction tryParseJsonInternal(jsonString) {\n try {\n const data = JSON.parse(jsonString);\n if (typeof data === 'object' && data !== null) {\n return { data: data, error: null };\n } else {\n return { data: null, error: \"Parsed data is not a JSON object or array.\" };\n }\n } catch (e) {\n let errorMessage = e.message;\n if (e.message.includes('position')) {\n try {\n const positionMatch = e.message.match(/position\\s+(\\d+)/);\n if (positionMatch && positionMatch[1]) {\n const position = parseInt(positionMatch[1], 10);\n const contextChars = 20;\n const start = Math.max(0, position - contextChars);\n const end = Math.min(jsonString.length, position + contextChars);\n const context = jsonString.substring(start, end);\n errorMessage += ` (near: ...${context}...)`;\n }\n } catch (contextError) { /* Ignore error during context generation */ }\n }\n return { data: null, error: errorMessage };\n }\n}\n\n\n/**\n * Attempts to fix unescaped double quotes within JSON strings.\n * @param {string} jsonString The potentially malformed JSON string.\n * @returns {string} The JSON string with an attempted quote fix.\n */\nfunction fixJsonStringQuotes(jsonString) {\n let fixed = \"\";\n let inString = false;\n let escapeNext = false;\n\n for (let i = 0; i < jsonString.length; i++) {\n const char = jsonString[i];\n\n if (escapeNext) { fixed += char; escapeNext = false; continue; }\n if (char === '\\\\') { fixed += '\\\\'; escapeNext = true; continue; }\n if (char === '\"') {\n if (inString) {\n let nextMeaningfulChar = null;\n for (let j = i + 1; j < jsonString.length; j++) {\n if (!/\\s/.test(jsonString[j])) { nextMeaningfulChar = jsonString[j]; break; }\n }\n if (nextMeaningfulChar === null || [':', ',', '}', ']'].includes(nextMeaningfulChar)) {\n fixed += '\"'; inString = false;\n } else { fixed += '\\\\\"'; } // Escape internal quote\n } else { fixed += '\"'; inString = true; }\n } else { fixed += char; }\n }\n return fixed;\n}\n\n\n/**\n * Extracts potential JSON objects or arrays based on balancing { } and [ ] characters.\n * @param {string} text The source text.\n * @returns {string[]} An array of potentially JSON strings.\n */\nfunction extractPotentialJsonStrings(text) {\n const results = [];\n let braceDepth = 0, bracketDepth = 0, startIndex = -1, inString = false, escapeNext = false;\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n if (escapeNext) { escapeNext = false; continue; }\n if (char === '\\\\') { escapeNext = true; continue; }\n if (char === '\"') { inString = !inString; }\n if (!inString) {\n if (char === '{') { if (braceDepth === 0 && bracketDepth === 0) startIndex = i; braceDepth++; }\n else if (char === '}') { if (braceDepth > 0) { braceDepth--; if (braceDepth === 0 && bracketDepth === 0 && startIndex !== -1) { results.push(text.substring(startIndex, i + 1)); startIndex = -1; } } }\n else if (char === '[') { if (braceDepth === 0 && bracketDepth === 0) startIndex = i; bracketDepth++; }\n else if (char === ']') { if (bracketDepth > 0) { bracketDepth--; if (braceDepth === 0 && bracketDepth === 0 && startIndex !== -1) { results.push(text.substring(startIndex, i + 1)); startIndex = -1; } } }\n }\n }\n return results;\n}\n\n/**\n * Attempts to fix trailing commas.\n * @param {string} jsonString JSON string potentially with trailing commas.\n * @returns {string} Corrected string.\n */\nfunction fixTrailingCommas(jsonString) {\n try { return jsonString.replace(/,\\s*([}\\]])/g, '$1'); }\n catch(e) { return jsonString; }\n}\n\n/**\n * Main function to find and parse the first valid JSON object/array in a text,\n * with pre-cleaning and multiple correction attempts.\n * Merges the keys of the found JSON with parsing metadata.\n *\n * @param {string} text The text potentially containing JSON.\n * @returns {object} An object containing the keys of the parsed JSON (if object)\n * or a 'parsed_data' key (if array), and a 'parsing_status' object.\n */\nfunction findAndParseJsonRobustly(text) {\n let firstParsedData = null;\n const parsing_status = {\n success: false,\n successfulMethod: null,\n controlCharFixApplied: false, // New flag\n invalidEscapeFixApplied: false,\n trailingCommaFixApplied: false,\n quoteFixApplied: false,\n parsingLog: [],\n errors: [],\n originalInput: text,\n cleanedInput: null,\n finalAttemptedJsonString: null\n };\n\n if (!text || typeof text !== 'string') {\n parsing_status.errors.push(\"Input text is null or not a string.\");\n parsing_status.parsingLog.push(\"Validation failed: Input is not a valid string.\");\n return { parsing_status };\n }\n\n parsing_status.parsingLog.push(\"Starting robust JSON parsing.\");\n\n let currentText = text.trim();\n parsing_status.parsingLog.push(`Original length: ${text.length}, Trimmed length: ${currentText.length}`);\n const markdownBlockRegex = /^```(?:json)?\\s*([\\s\\S]*?)\\s*```$/;\n const match = currentText.match(markdownBlockRegex);\n if (match && match[1]) {\n currentText = match[1].trim();\n parsing_status.parsingLog.push(\"Detected and removed Markdown code block fences.\");\n } else {\n parsing_status.parsingLog.push(\"No Markdown code block fences detected.\");\n }\n parsing_status.cleanedInput = currentText;\n parsing_status.parsingLog.push(`Cleaned text length after potential fence removal: ${currentText.length}`);\n\n function processSuccess(data, method, flags) {\n parsing_status.parsingLog.push(`Success with method: ${method}`);\n parsing_status.success = true;\n parsing_status.successfulMethod = method;\n parsing_status.controlCharFixApplied = flags.controlCharFixApplied || false;\n parsing_status.invalidEscapeFixApplied = flags.invalidEscapeFixApplied || false;\n parsing_status.trailingCommaFixApplied = flags.trailingCommaFixApplied || false;\n parsing_status.quoteFixApplied = flags.quoteFixApplied || false;\n firstParsedData = data;\n }\n\n function attemptParseAndFix(textToParse, baseMethodName) {\n let currentAttemptText = textToParse;\n let flags = { controlCharFixApplied: false, invalidEscapeFixApplied: false, trailingCommaFixApplied: false, quoteFixApplied: false };\n let method = baseMethodName;\n let parseResult;\n\n // 0. Escape control characters WITHIN strings (BEFORE fixInvalidEscapes)\n parsing_status.parsingLog.push(`[${baseMethodName}] Applying control character escaping in strings...`);\n let fixedControlCharsText = escapeControlCharsInStrings(currentAttemptText);\n if (fixedControlCharsText !== currentAttemptText) {\n parsing_status.parsingLog.push(`[${baseMethodName}] Control characters in strings escaped.`);\n flags.controlCharFixApplied = true;\n currentAttemptText = fixedControlCharsText;\n method = `${baseMethodName} + Control Char Escape`;\n } else {\n parsing_status.parsingLog.push(`[${baseMethodName}] No control characters in strings needed escaping or found.`);\n }\n parsing_status.finalAttemptedJsonString = currentAttemptText;\n parseResult = tryParseJsonInternal(currentAttemptText);\n if (parseResult.data) { processSuccess(parseResult.data, method, flags); return true; }\n parsing_status.parsingLog.push(`[${baseMethodName}] Parse failed after control char escape (if any): ${parseResult.error}`);\n parsing_status.errors.push(`Parse (${method}): ${parseResult.error}`);\n\n\n // 1. Fix invalid escapes (backslash)\n parsing_status.parsingLog.push(`[${baseMethodName}] Applying invalid escape fix (escaping backslash)...`);\n let fixedEscapesText = fixInvalidEscapes(currentAttemptText);\n if (fixedEscapesText !== currentAttemptText) {\n parsing_status.parsingLog.push(`[${baseMethodName}] Invalid backslash escapes fixed.`);\n flags.invalidEscapeFixApplied = true;\n currentAttemptText = fixedEscapesText;\n method = `${baseMethodName}${flags.controlCharFixApplied ? ' + Control Char Escape' : ''} + Invalid Escape Fix`;\n } else {\n parsing_status.parsingLog.push(`[${baseMethodName}] No invalid backslash escapes found/fixed.`);\n }\n parsing_status.finalAttemptedJsonString = currentAttemptText;\n parseResult = tryParseJsonInternal(currentAttemptText);\n if (parseResult.data) { processSuccess(parseResult.data, method, flags); return true; }\n parsing_status.parsingLog.push(`[${baseMethodName}] Parse failed after invalid escape fix (if any): ${parseResult.error}`);\n parsing_status.errors.push(`Parse (${method}): ${parseResult.error}`);\n\n\n // 2. Fix trailing commas\n parsing_status.parsingLog.push(`[${baseMethodName}] Applying trailing comma fix...`);\n let fixedCommasText = fixTrailingCommas(currentAttemptText);\n if (fixedCommasText !== currentAttemptText) {\n parsing_status.parsingLog.push(`[${baseMethodName}] Trailing commas fixed.`);\n flags.trailingCommaFixApplied = true;\n currentAttemptText = fixedCommasText;\n method = `${baseMethodName}${flags.controlCharFixApplied ? ' + Control Char Escape' : ''}${flags.invalidEscapeFixApplied ? ' + Invalid Escape Fix' : ''} + Trailing Comma Fix`;\n parsing_status.finalAttemptedJsonString = currentAttemptText;\n parseResult = tryParseJsonInternal(currentAttemptText);\n if (parseResult.data) { processSuccess(parseResult.data, method, flags); return true; }\n parsing_status.parsingLog.push(`[${baseMethodName}] Parse failed after comma fix: ${parseResult.error}`);\n parsing_status.errors.push(`Parse (${method}): ${parseResult.error}`);\n } else {\n parsing_status.parsingLog.push(`[${baseMethodName}] No trailing commas found/fixed.`);\n }\n\n // 3. Fix quotes\n parsing_status.parsingLog.push(`[${baseMethodName}] Applying quote fix...`);\n try {\n let fixedQuotesText = fixJsonStringQuotes(currentAttemptText);\n if (fixedQuotesText !== currentAttemptText) {\n parsing_status.parsingLog.push(`[${baseMethodName}] Quotes fixed.`);\n flags.quoteFixApplied = true;\n currentAttemptText = fixedQuotesText;\n method = `${baseMethodName}${flags.controlCharFixApplied ? ' + Control Char Escape' : ''}${flags.invalidEscapeFixApplied ? ' + Invalid Escape Fix' : ''}${flags.trailingCommaFixApplied ? ' + Trailing Comma Fix' : ''} + Quote Fix`;\n parsing_status.finalAttemptedJsonString = currentAttemptText;\n parseResult = tryParseJsonInternal(currentAttemptText);\n if (parseResult.data) { processSuccess(parseResult.data, method, flags); return true; }\n parsing_status.parsingLog.push(`[${baseMethodName}] Parse failed after quote fix: ${parseResult.error}`);\n parsing_status.errors.push(`Parse (${method}): ${parseResult.error}`);\n } else {\n parsing_status.parsingLog.push(`[${baseMethodName}] Quote fixing did not modify the text.`);\n }\n } catch (e) {\n parsing_status.parsingLog.push(`[${baseMethodName}] Error during quote fixing attempt: ${e.message}`);\n parsing_status.errors.push(`Parse (${method} - quote fix error): ${e.message}`);\n }\n \n parsing_status.finalAttemptedJsonString = currentAttemptText;\n return false;\n }\n\n parsing_status.parsingLog.push(\"Attempting parse/fix on entire cleaned text...\");\n attemptParseAndFix(parsing_status.cleanedInput, \"Direct\");\n\n if (!firstParsedData) {\n parsing_status.parsingLog.push(\"Direct processing failed. Attempting structured extraction...\");\n const candidates = extractPotentialJsonStrings(parsing_status.cleanedInput);\n parsing_status.parsingLog.push(`Found ${candidates.length} potential JSON candidate(s) via balancing.`);\n\n for (let i = 0; i < candidates.length && !firstParsedData; i++) {\n const candidate = candidates[i];\n parsing_status.parsingLog.push(`Attempting parse/fix on candidate ${i + 1}/${candidates.length}...`);\n attemptParseAndFix(candidate, `Structured Candidate ${i + 1}`);\n }\n }\n\n if (firstParsedData) {\n parsing_status.parsingLog.push(`Successfully parsed JSON found using method: ${parsing_status.successfulMethod}.`);\n if (typeof firstParsedData === 'object' && !Array.isArray(firstParsedData)) {\n return { ...firstParsedData, parsing_status: parsing_status };\n } else {\n parsing_status.parsingLog.push(\"Parsed data is an array or non-object, returning under 'parsed_data' key.\");\n return { parsed_data: firstParsedData, parsing_status: parsing_status };\n }\n } else {\n parsing_status.parsingLog.push(\"No valid JSON object or array could be parsed from the input after all attempts.\");\n parsing_status.success = false;\n if (!parsing_status.finalAttemptedJsonString && parsing_status.cleanedInput) {\n parsing_status.finalAttemptedJsonString = parsing_status.cleanedInput;\n } else if (!parsing_status.finalAttemptedJsonString) {\n parsing_status.finalAttemptedJsonString = text;\n }\n return { parsing_status: parsing_status };\n }\n}\n\n// --- n8n Usage ---\nconst inputItem = $input.item.json; \nconst inputText = inputItem && inputItem.text ? inputItem.text : null;\nconst parsingResult = findAndParseJsonRobustly(inputText);\n\nreturn parsingResult;"
},
"typeVersion": 2
},
{
"id": "680ea730-fc1f-40d8-91e9-0ea06b09d472",
"name": "Remove parsing_status",
"type": "n8n-nodes-base.set",
"position": [
672,
-64
],
"parameters": {
"include": "except",
"options": {},
"excludeFields": "parsing_status",
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "9a42c258-cbb3-4c56-9b6e-53bd77b0f207",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
608,
-336
],
"parameters": {
"color": 7,
"width": 360,
"height": 440,
"content": "#### \u2699\ufe0f OUTPUT CLEANUP\n\nThis node removes the detailed `parsing_status` object from the final output to keep it clean.\n\n**Want to see the full parsing log for debugging?**\n\n\u27a1\ufe0f **Just deactivate or delete this node.**\n\nYou will then get the full output from the parser, including the `parsing_status` object which shows every step and fix that was applied."
},
"typeVersion": 1
},
{
"id": "c71da6a1-7553-4c3c-b17a-9a5eecc02552",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-624,
-336
],
"parameters": {
"color": 7,
"width": 360,
"height": 440,
"content": "#### \u25b6\ufe0f INPUT NODE\n\nThis workflow expects an input item with a `text` field. The value of this field should be the **string** you want to parse.\n\n**Example Input:**\n```json\n{\n \"text\": \"Some text from an AI... {\\\\\\\"key\\\\\\\": \\\\\\\"value with an unescaped \\\\\\\"quote\\\\\\\" inside\\\\\\\"}\"\n}"
},
"typeVersion": 1
},
{
"id": "b5f8dc12-5092-42ba-bb50-47f760418ca8",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
80,
-528
],
"parameters": {
"color": 6,
"width": 480,
"height": 620,
"content": "#### \ud83e\udde0 CORE LOGIC: The Parser\n\nThis node contains all the logic for cleaning and parsing the input string. It does not need to be edited for normal use.\n\n**Process Overview:**\n1. **Cleans Input:** Removes Markdown fences (```) and trims whitespace.\n2. **Applies Fixes in Order:**\n * Escapes control characters (`\\n`, `\\t`) inside strings.\n * Fixes invalid backslashes (e.g., `\\\"` -> `\\\\\"`).\n * Removes trailing commas.\n * Attempts to fix unescaped quotes within values.\n3. **Parses:** Tries to parse the cleaned string. If it fails, it looks for a `{...}` or `[...]` block within the text and tries again.\n\n\n**Output:**\n* The successfully parsed JSON fields.\n* A `parsing_status` object with detailed logs and debugging info."
},
"typeVersion": 1
},
{
"id": "e54cafca-18cf-40de-8cce-0fd7ec9e428b",
"name": "Convert to JSON",
"type": "n8n-nodes-base.set",
"onError": "continueErrorOutput",
"position": [
-144,
-64
],
"parameters": {
"mode": "raw",
"options": {},
"jsonOutput": "={{ $json.text.replace(/^```json\\s*|\\s*```$/g, '') }}"
},
"typeVersion": 3.4
},
{
"id": "140f3f24-935b-4f0c-bad4-8ffdda34da74",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1024,
-608
],
"parameters": {
"color": 7,
"width": 320,
"height": 704,
"content": "## \ud83d\udee0\ufe0f Process AI Output to Structured JSON with Robust JSON Parser\n\nStop AI hallucinations from breaking your flows by automatically cleaning and repairing malformed JSON output.\n\n### How it works\n\n* **Markdown Cleanup**: Removes the ` ```json ` code blocks often returned by LLMs.\n* **Auto-Repair**: Uses a script to fix common errors like unescaped quotes, bad escapes, or trailing commas.\n* **Clean Output**: Returns a validated JSON object ready for your next nodes.\n\n### Automate your operations today\nYour time is valuable. Let us automate the boring stuff for you.\n\n\n**\ud83d\udc47 CHOOSE YOUR PATH:**\n\n[ **\u26a1\ufe0f I WANT A FREE AUDIT (2 min)** ](https://workflows.ac/audit?utm_source=n8n_template&utm_medium=workflow_note&utm_campaign=process_ai_output_to_structured_json_with_robust_json_parser&utm_content=5146)\n> *We've put our heart into this business evaluation machine.*\n\n[ **\ud83d\udca1 I HAVE A SPECIFIC REQUEST** ](https://workflows.ac/form?utm_source=n8n_template&utm_medium=workflow_note&utm_campaign=process_ai_output_to_structured_json_with_robust_json_parser&utm_content=5146)\n\n\n"
},
"typeVersion": 1
},
{
"id": "0641599d-9712-4b9c-9177-ec6e367db75c",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1024,
-1008
],
"parameters": {
"color": 7,
"width": 320,
"height": 1104,
"content": "---\n\n## Was this helpful? Let me know!\n[](https://api.ia2s.app/form/templates/academy)\n\nI really hope this template helped you. Your feedback is what helps me create better resources for the n8n community.\n\n### **Have Feedback, a Question, or a Project Idea?**\n\n\n#### \u27a1\ufe0f **[Click here to go to the Contact Form](https://workflows.ac/form?utm_source=n8n_template&utm_medium=workflow_note&utm_campaign=process_ai_output_to_structured_json_with_robust_json_parser&utm_content=5146)**\n\nUse this single link for anything you need:\n\n* **Give Feedback:** Share your thoughts on this template, whether you found a typo, encountered an unexpected error, have a suggestion, or just want to say thanks!\n\n* **Automation Coaching:** Get personalized, one-on-one guidance to master n8n. We can work together to help you reach an expert level.\n\n* **Automation Consulting:** Have a complex business challenge or need custom workflows built from scratch? We offer a plug and play automation department for 8 to 88 people teams with unlimited automation requests.\n\n---\n\nHappy Automating!\nLucas Peyrin | [Workflows Accelerator](https://workflows.ac?utm_source=n8n_template&utm_medium=workflow_note&utm_campaign=process_ai_output_to_structured_json_with_robust_json_parser&utm_content=5146)"
},
"typeVersion": 1
}
],
"connections": {
"Convert to JSON": {
"main": [
[],
[
{
"node": "Safe JSON Parser",
"type": "main",
"index": 0
}
]
]
},
"Safe JSON Parser": {
"main": [
[
{
"node": "Remove parsing_status",
"type": "main",
"index": 0
}
]
]
},
"Robust JSON Parser": {
"main": [
[
{
"node": "Convert to JSON",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow is a robust and forgiving JSON parser designed to handle malformed or "dirty" JSON strings often returned by AI models or scraped from web pages. It takes a text string as input and attempts to extract and parse a valid JSON object from it. Cleans Input: It starts…
Source: https://n8n.io/workflows/5146/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Back up n8n workflows to Google Drive automatically This workflow provides a robust solution for backing up your n8n workflows to Google Drive. It is designed to handle backups for multiple n8n instan
This workflow uses KlickTipp community nodes, available for self-hosted n8n instances only.
This automation monitors X (formerly Twitter) search pages in real time and extracts high-signal posts that match your categories of interest. It’s ideal for community engagement, lead discovery, thou
This template provides a powerful and configurable utility to convert JSON data into a clean, well-structured XML format. It is designed for developers, data analysts, and n8n users who need to interf
This powerful automation helps you stay ahead of the competition by identifying sales opportunities in real-time. Here’s how it works: