Improve error handling for malformed JSON syntax
Fixes #12 by properly distinguishing between malformed JSON (invalid syntax) and partial JSON (incomplete but valid syntax).
Problem
The parser was silently swallowing invalid JSON syntax instead of throwing errors:
- Invalid numbers starting with dots -
.0516156161551515would be silently ignored, causing the rest of valid JSON to be discarded - Invalid tokens in arrays -
[abcwould return[]instead of throwing an error - Empty arrays with spaces -
[ ]would cause parsing to terminate early, discarding subsequent valid JSON
Example
Before this fix:
parse(`{
"vector": [1, 2, 3, .0516156161551515, 7],
"info": "valid data"
}`)
// Returns: { "vector": [1, 2, 3] } // Silent truncation!
After this fix:
parse(`{
"vector": [1, 2, 3, .0516156161551515, 7],
"info": "valid data"
}`)
// Throws: MalformedJSON: Unexpected token '.' at position 83
Solution
-
Enhanced token validation - Added proper validation before attempting to parse numbers, rejecting invalid tokens like
.123andabc -
Improved array parsing - Fixed whitespace handling in arrays by adding
skipBlank()calls at appropriate points -
Better error propagation - Modified
parseArr()andparseObj()to letMalformedJSONerrors bubble up while still allowingPartialJSONerrors to be handled gracefully for incomplete but valid JSON
Backward Compatibility
β All existing functionality is preserved:
- Valid partial JSON parsing continues to work exactly as before
- All existing tests pass without modification
- The
Allowflags continue to control partial parsing behavior as expected
This change only affects clearly invalid JSON syntax that should never have been accepted in the first place.
π‘ You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.
Summary by CodeRabbit
-
Bug Fixes
- Improved error handling for malformed JSON, ensuring invalid numbers and tokens are correctly identified and reported.
- Enhanced whitespace handling within arrays to ensure accurate parsing.
-
Tests
- Added comprehensive test cases to verify correct error reporting for invalid JSON inputs and to confirm proper handling of edge cases.
The latest updates on your projects. Learn more about Vercel for Git βοΈ
| Name | Status | Preview | Comments | Updated (UTC) |
|---|---|---|---|---|
| partial-json-coverage | β Ready (Inspect) | Visit Preview | π¬ Add feedback | Aug 4, 2025 10:28pm |
Run & review this pull request in StackBlitz Codeflow.
@coderabbitai review
β Actions performed
Review triggered.
Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.
Walkthrough
The changes improve JSON parsing by enhancing error handling for malformed numbers and invalid tokens, ensuring that syntax errors are no longer silently ignored. The parser now strictly validates number formats, propagates MalformedJSON errors, and adds new tests to verify that invalid input triggers errors rather than partial or incorrect parsing results.
Changes
| Cohort / File(s) | Change Summary |
|---|---|
Parser Logic Improvementssrc/index.ts |
Refines error handling in JSON parsing: validates number start tokens, ensures MalformedJSON errors propagate, improves whitespace skipping in arrays, and makes number parsing stricter and more robust. |
Tests for Issue #12tests/issue12.test.js |
Adds tests for invalid numbers and tokens, confirming that malformed input now throws MalformedJSON errors as expected and valid edge cases still parse correctly. |
Sequence Diagram(s)
sequenceDiagram
participant TestSuite as Test Suite
participant Parser as JSON Parser
participant Error as MalformedJSON
TestSuite->>Parser: parse(JSON string)
alt Valid JSON
Parser-->>TestSuite: Return parsed object/array
else Invalid number or token
Parser-->>Error: Throw MalformedJSON
Error-->>TestSuite: Error is caught and asserted
end
Estimated code review effort
π― 2 (Simple) | β±οΈ ~8 minutes
Assessment against linked issues
| Objective | Addressed | Explanation |
|---|---|---|
| Ensure parser throws error for invalid numbers instead of silently ignoring them (#12) | β | |
| Prevent partial parsing when encountering malformed numbers or invalid tokens in arrays/objects (#12) | β | |
| Add tests to verify error reporting for invalid number formats and tokens (#12) | β |
Poem
A rabbit with code in its fur and its nose,
Digs through the JSON where error now shows.
No more silent skipping, no numbers astrayβ
Malformed tokens are caught, no data goes away!
With tests in the meadow and parsing made bright,
The bugs hop away, and the code feels just right.
πβ¨
[!NOTE]
β‘οΈ Unit Test Generation is now available in beta!
Learn more here, or try it out under "Finishing Touches" below.
β¨ Finishing Touches
- [ ] π Generate Docstrings
π§ͺ Generate unit tests
- [ ] Create PR with unit tests
- [ ] Post copyable unit tests in a comment
- [ ] Commit unit tests in branch
copilot/fix-d63c1154-0fba-4921-80da-192e5f9b9723
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.
πͺ§ Tips
Chat
There are 3 ways to chat with CodeRabbit:
- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
I pushed a fix in commit <commit_id>, please review it.Explain this complex logic.Open a follow-up GitHub issue for this discussion.
- Files and specific lines of code (under the "Files changed" tab): Tag
@coderabbitaiin a new review comment at the desired location with your query. Examples:@coderabbitai explain this code block.
- PR comments: Tag
@coderabbitaiin a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.@coderabbitai read src/utils.ts and explain its main purpose.@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
Support
Need help? Create a ticket on our support page for assistance with any issues or questions.
CodeRabbit Commands (Invoked using PR comments)
@coderabbitai pauseto pause the reviews on a PR.@coderabbitai resumeto resume the paused reviews.@coderabbitai reviewto trigger an incremental review. This is useful when automatic reviews are disabled for the repository.@coderabbitai full reviewto do a full review from scratch and review all the files again.@coderabbitai summaryto regenerate the summary of the PR.@coderabbitai generate docstringsto generate docstrings for this PR.@coderabbitai generate sequence diagramto generate a sequence diagram of the changes in this PR.@coderabbitai generate unit teststo generate unit tests for this PR.@coderabbitai resolveresolve all the CodeRabbit review comments.@coderabbitai configurationto show the current CodeRabbit configuration for the repository.@coderabbitai helpto get help.
Other keywords and placeholders
- Add
@coderabbitai ignoreanywhere in the PR description to prevent this PR from being reviewed. - Add
@coderabbitai summaryto generate the high-level summary at a specific location in the PR description. - Add
@coderabbitaianywhere in the PR title to generate the title automatically.
CodeRabbit Configuration File (.coderabbit.yaml)
- You can programmatically configure CodeRabbit by adding a
.coderabbit.yamlfile to the root of your repository. - Please see the configuration documentation for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation:
# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json
Documentation and Community
- Visit our Documentation for detailed information on how to use CodeRabbit.
- Join our Discord Community to get help, request features, and share feedback.
- Follow us on X/Twitter for updates and announcements.