Skip to main content

Overview

The JsonParser block parses JSON strings into JavaScript objects so you can access their properties in assertions and subsequent blocks.
{
  "block": "JsonParser",
  "input": "${response.body}",
  "output": {
    "parsed": "data"
  }
}

Input Parameters

Required

ParameterTypeDescription
bodystringJSON string to parse

Output Fields

On Success

FieldTypeDescription
parsedobject/arrayThe parsed JSON data

On Failure

FieldTypeDescription
errorstringError message describing parse failure
rawstringOriginal unparsed body

Examples

Basic Usage

{
  "pipeline": [
    {
      "block": "HttpRequest",
      "input": {
        "url": "https://api.example.com/users/1",
        "method": "GET"
      },
      "output": "response"
    },
    {
      "block": "JsonParser",
      "input": "${response.body}",
      "output": {
        "parsed": "user"
      }
    }
  ],
  "assertions": {
    "user.id": 1,
    "user.name": { "matches": ".+" }
  }
}
Flow:
  1. HttpRequest returns: { body: '{"id": 1, "name": "John"}' }
  2. JsonParser parses to: { parsed: { id: 1, name: "John" } }
  3. Stored in DataBus as: user = { id: 1, name: "John" }
  4. Assertions can access user.id and user.name

Using String Input Format

{
  "block": "JsonParser",
  "input": "${response.body}",
  "output": "parsed"
}
This automatically wraps the string as { body: value }: Access with: ${parsed.parsed.id}
{
  "block": "JsonParser",
  "input": "${response.body}",
  "output": {
    "parsed": "user"
  }
}
Access with: ${user.id} (cleaner!)

Parsing Arrays

{
  "pipeline": [
    {
      "block": "HttpRequest",
      "input": {
        "url": "https://api.example.com/users",
        "method": "GET"
      },
      "output": "response"
    },
    {
      "block": "JsonParser",
      "input": "${response.body}",
      "output": {
        "parsed": "users"
      }
    }
  ],
  "assertions": {
    "users[0].id": { "gt": 0 }
  }
}

Error Handling

If parsing fails, the block returns an error:
{
  error: "JSON parse error: Unexpected token...",
  raw: "invalid json{]"
}
You can check for errors in assertions:
{
  "assertions": {
    "parsed.error": null
  }
}
Or assert success by checking the parsed data exists:
{
  "assertions": {
    "user.id": { "gt": 0 }
  }
}

Common Patterns

HTTP Request + Parse

{
  "pipeline": [
    {
      "block": "HttpRequest",
      "input": { "url": "${API_URL}/data", "method": "GET" },
      "output": "response"
    },
    {
      "block": "JsonParser",
      "input": "${response.body}",
      "output": { "parsed": "data" }
    }
  ]
}

Nested Data Extraction

{
  "pipeline": [
    {
      "block": "HttpRequest",
      "output": "response"
    },
    {
      "block": "JsonParser",
      "input": "${response.body}",
      "output": { "parsed": "apiResponse" }
    }
  ],
  "assertions": {
    "apiResponse.data.users[0].email": { "matches": ".*@.*" }
  }
}

Multiple Parse Operations

{
  "pipeline": [
    {
      "block": "HttpRequest",
      "input": { "url": "${API_URL}/user", "method": "GET" },
      "output": "userResponse"
    },
    {
      "block": "JsonParser",
      "input": "${userResponse.body}",
      "output": { "parsed": "user" }
    },
    {
      "block": "HttpRequest",
      "input": { "url": "${API_URL}/posts", "method": "GET" },
      "output": "postsResponse"
    },
    {
      "block": "JsonParser",
      "input": "${postsResponse.body}",
      "output": { "parsed": "posts" }
    }
  ],
  "assertions": {
    "user.id": 1,
    "posts[0].userId": 1
  }
}

Full Example

{
  "name": "JSON Parsing Test",
  "context": {
    "BASE_URL": "https://jsonplaceholder.typicode.com"
  },
  "tests": [{
    "id": "test-parse",
    "pipeline": [
      {
        "id": "fetch",
        "block": "HttpRequest",
        "input": {
          "url": "${BASE_URL}/users/1",
          "method": "GET"
        },
        "output": "response"
      },
      {
        "id": "parse",
        "block": "JsonParser",
        "input": "${response.body}",
        "output": {
          "parsed": "user"
        }
      }
    ],
    "assertions": {
      "response.status": 200,
      "user.id": 1,
      "user.name": { "matches": ".+" },
      "user.email": { "matches": ".*@.*" },
      "user.address.city": { "matches": ".+" }
    }
  }]
}

Tips

Map parsed to a descriptive name for cleaner references:
// Bad - nested access
"output": "result"
// Access: ${result.parsed.user.id}

// Good - direct access
"output": { "parsed": "user" }
// Access: ${user.id}
Check if parsing succeeded before making assertions:
{
  "assertions": {
    "data.id": { "gt": 0 }
  }
}
If parsed doesn’t exist (parse failed), assertion will fail with clear message.
Always parse JSON before using validation blocks:
{
  "pipeline": [
    { "block": "HttpRequest", "output": "response" },
    {
      "block": "JsonParser",
      "input": "${response.body}",
      "output": { "parsed": "data" }
    },
    {
      "block": "ValidateContent",
      "input": { "from": "data.message", "as": "text" }
    }
  ]
}

When to Use

Use JsonParser when:
  • Parsing HTTP response bodies
  • Converting JSON strings to objects
  • Accessing nested JSON properties
Don’t use when:
  • Response is already an object (not common in SemanticTest)
  • Parsing streaming responses (use StreamParser)

Next Steps

I