JsonParser
Extract and parse JSON from text input, handling both plain JSON and Markdown code blocks.
Basic Information​
- Type:
deepset_cloud_custom_nodes.parsers.json_parser.JsonParser - Components it can connect with:
OpenAIChatGenerator:JsonParserreceives text containing JSON from a generator.- Any component that produces text output containing JSON data.
Inputs​
| Parameter | Type | Default | Description |
|---|---|---|---|
| text | str | Text containing JSON to parse. |
Outputs​
| Parameter | Type | Default | Description |
|---|---|---|---|
| parsed_json | Dict[str, Any] | The parsed JSON object. |
Overview​
Use JsonParser to extract and parse JSON from text that may be wrapped in Markdown code blocks. This is useful when processing language model outputs that return JSON data, as models often wrap JSON in Markdown formatting.
The component handles:
- Plain JSON strings
- JSON wrapped in markdown code blocks (
```json ... ```) - JSON wrapped in generic code blocks (
``` ... ```)
Usage Example​
This is an example of JsonParser that receives text containing JSON from a generator and parses it. There is an OutputAdapter between the generator and JsonParser to align the input and output types of these two components:
components:
DeepsetChatHistoryParser:
type: deepset_cloud_custom_nodes.parsers.chat_history_parser.DeepsetChatHistoryParser
init_parameters: {}
ChatPromptBuilder:
type: haystack.components.builders.chat_prompt_builder.ChatPromptBuilder
init_parameters:
template: "{% message role=\\\"system\\\" %}\\nDu bist ein exzellentes Labelling-Tool.\\nDu bekommst einen Chatverlauf.\\n\\n**1. Label Bestimmung**\\nFalls die letzte user Frage nach Informationen aus einer Datenbank sucht, gebe \\\"FRAGE\\\" aus.\\nDies ist auch der Fall, wenn etwas erklärt werden soll oder eine Aufgabe gestellt wird, deren Lösung den Abruf von neuen Informationen erfordert (z.B. Vergleiche, Tabellen, Analysen erstellen).\\n**WICHTIG:** Auch reine Sachverhaltsschilderungen (z.B. juristische Fälle) ohne explizite Frage fallen unter das Label \\\"FRAGE\\\", da sie implizit nach einer rechtlichen Einordnung oder ähnlichen Fällen suchen.\\n\\nFalls die letzte user Frage Instruktionen sind zum Arbeiten mit einer bereits im Chatverlauf vorhandenen oder vom User explizit bereitgestellten Passage, gebe \\\"PASSAGE\\\" aus. Dies gilt nur, wenn keine neuen Informationen aus einer Datenbank abgerufen werden müssen.\\nFalls der Chatverlauf nur eine user Message enthält, kann nicht das Label \\\"PASSAGE\\\" ausgegeben werden.\\nBeispielfragen, welche sich auf die Passage beziehen, sind: 'schreibe davon eine zusammenfassung', 'in stichpunkten' oder 'formuliere als email um'.\\n\\n**2. Output für \\\"PASSAGE\\\"**\\nFür das Label \\\"PASSAGE\\\" gibst du NICHTS zusätzlich aus.\\nFormat: { \\\"label\\\": \\\"PASSAGE\\\" }\\n\\n**3. Output für \\\"FRAGE\\\"**\\nFür das Label \\\"FRAGE\\\" gibst du zusätzlich \\\"query\\\" und \\\"complexity\\\" aus.\\n\\n**A) Query-Generierung:**\\nDie \\\"query\\\" muss in natürlicher Sprache sein, da sie von einer keyword und einer semantic search hybrid verarbeitet wird. Sei daher möglichst explizit mit den Keywords.\\n\\n**Spezialfall Sachverhalt:** Wenn der User-Input eine reine Sachverhaltsschilderung (Fakten, Fallbeispiel) ohne explizite Frage ist, generiere als \\\"query\\\" eine prägnante **Fallbeschreibung**, die die wesentlichen Fakten und juristischen Probleme zusammenfasst (z.B. \\\"Fallbeschreibung: Schenkung unter Auflage, nachträglicher Diebstahl durch Beschenkte und Haftung für Drittschaden\\\"). Formuliere in diesem Fall KEINE hypothetischen Fragen.\\n\\nWenn nach X auch nach Y gefragt wird, frage in der \\\"query\\\" nur nach Y und wiederhole nicht noch einmal X.\\nAbkürzungen wie \\\"ArbVG\\\", \\\"BVwG\\\" oder \\\"Abs\\\", sowie alle Paragraphen bleiben bestehen und dürfen in der \\\"query\\\" nicht umformuliert werden.\\nWenn die Frage keinen Kontext aus der Chat Historie benötigt, gebe sie unbearbeitet in \\\"query\\\" aus.\\n\\n**B) Komplexitätsbestimmung (Complexity Analysis):**\\nBestimme die Komplexität des Retrievals (\\\"complexity\\\") basierend auf der Schwierigkeit der Anfrage:\\n- **simple**: 1-2 Aspekte/Anspruchsgrundlagen, 1 Themengebiet, klare Faktenabfrage oder Definition, Standard-Recherche.\\n- **medium**: 2-4 Aspekte, 2-3 Themengebiete, Vergleiche zwischen zwei Entitäten, Listen, abgrenzbare Themen.\\n- **high**: 5-7 Aspekte, 3-4 Themengebiete mit Wechselwirkungen, Synthese aus mehreren Quellen nötig, Abhängigkeiten (Wenn X, dann Y).\\n- **very_high**: ≥8 Aspekte ODER ≥3-stufige Verschachtelungen ODER systematische Widersprüche ODER sehr abstrakte Analyseanforderungen.\\n\\nFormat für FRAGE: { \\\"label\\\": \\\"FRAGE\\\", \\\"query\\\": \\\"...\\\", \\\"complexity\\\": \\\"...\\\" }\\n{% endmessage %}\\n\\n{% for message in chat_history %}\\n{% message role=message.role %}\\n{{ message.text }}\\n{% endmessage %}\\n{% endfor %}\\n\\n{% message role=\\\"assistant\\\" %}\\n{ \\\"label\\\": \\\"\\n{% endmessage %}"
required_variables: '*'
variables:
DeepsetAmazonBedrockChatGenerator:
type: deepset_cloud_custom_nodes.generators.chat.deepset_amazon_bedrock_chat_generator.DeepsetAmazonBedrockChatGenerator
init_parameters:
model: anthropic.claude-3-7-sonnet-20250219-v1:0
aws_region_name:
generation_kwargs:
max_tokens: 512
temperature: 0
streaming_callback:
boto3_config:
tools:
OutputAdapter:
type: haystack.components.converters.output_adapter.OutputAdapter
init_parameters:
template: '{ "mode": "{{ (replies|last).text }}'
output_type: str
custom_filters:
unsafe: false
JsonParser:
type: deepset_cloud_custom_nodes.parsers.json_parser.JsonParser
init_parameters:
code_block_pattern: '```(?:json)?\n(.*?)\n```'
ConditionalRouter:
type: haystack.components.routers.conditional_router.ConditionalRouter
init_parameters:
routes:
- condition: '{{decision.mode == "PASSAGE"}}'
output: '{{history}}'
output_name: followup
output_type: typing.List[haystack.dataclasses.ChatMessage]
- condition: '{{decision.mode == "FRAGE" and decision.complexity in ["simple", "medium"]}}'
output: '{{decision.query}}'
output_name: search
output_type: str
- condition: '{{decision.mode == "FRAGE" and decision.complexity not in ["simple", "medium"]}}'
output: '{{history}}'
output_name: agent
output_type: typing.List[haystack.dataclasses.ChatMessage]
- condition: '{{True}}'
output: '{{(history|last).text}}'
output_name: search_last_history
output_type: str
custom_filters: {}
unsafe: false
validate_output_type: false
optional_variables:
connections:
- sender: DeepsetChatHistoryParser.messages
receiver: ChatPromptBuilder.template
- sender: ChatPromptBuilder.prompt
receiver: DeepsetAmazonBedrockChatGenerator.messages
- sender: DeepsetAmazonBedrockChatGenerator.replies
receiver: OutputAdapter.replies
- sender: OutputAdapter.output
receiver: JsonParser.text
- sender: JsonParser.parsed_json
receiver: ConditionalRouter.decision
- sender: DeepsetChatHistoryParser.messages
receiver: ConditionalRouter.history
max_runs_per_component: 100
metadata: {}
inputs:
query:
- DeepsetChatHistoryParser.history_and_query
....
Parameters​
Init Parameters​
These are the parameters you can configure in Pipeline Builder:
| Parameter | Type | Default | Description |
|---|---|---|---|
| code_block_pattern | str | "(?:json)?\\n(.*?)\\n" | Regular expression pattern to extract JSON from markdown code blocks. The pattern should include a capture group for the JSON content. |
Run Method Parameters​
These are the parameters you can configure for the component's run() method. You can pass these parameters at query time through the API, in Playground, or when running a job.
| Parameter | Type | Default | Description |
|---|---|---|---|
| text | str | Text containing JSON to parse. Can be plain JSON or JSON wrapped in markdown code blocks. |
Was this page helpful?