Top AI Repos — open-source AI, indexed and scored
Top AI Repos tracks AI repositories on GitHub and answers two different questions about each one: is it moving right now, and would you bet a product on it.
Top AI Repos tracks AI repositories on GitHub and answers two different questions about each one: is it moving right now, and would you bet a product on it.
Parse incomplete JSON text in best-effort manner. Useful for partial JSON responses, broken network packages, LLM responses with markdown fences or exceeding token limits, and configuration files with comments.
| Date | Stars |
|---|---|
| 2026-07-31 | 278 |
| 2026-08-06 | 278 |
Today
— stars today
This week
— stars this week
This month
— stars this month
Momentum
0.0
growth rate 0.00%/day
# best-effort-json-parser
Parse incomplete JSON text in best-effort manner. Useful for partial JSON responses, broken network packages, LLM responses with markdown fences or exceeding token limits, and configuration files with comments.
[](https://www.npmjs.com/package/best-effort-json-parser)
[](https://bundlephobia.com/package/best-effort-json-parser)
[](https://bundlephobia.com/package/best-effort-json-parser)
[](https://www.npmtrends.com/best-effort-json-parser)
## Features
- Typescript support
- Isomorphic package: works in Node.js and browsers
- Comment support: `// inline`, `/* multi-line */`, and `<!-- HTML-style -->` comments
- Markdown code block support: extracts JSON from ` ```json ` or ` ``` ` fences during parsing; remaining text is available via `parse.lastParseReminding`
## Installation
```bash
npm install best-effort-json-parser
```
You can also install `best-effort-json-parser` with [pnpm](https://pnpm.io/), [yarn](https://yarnpkg.com/), or [slnpm](https://github.com/beenotung/slnpm)
## Usage Example
### Parsing incomplete JSON text
If the string, object, or array is not complete, the parser will return the partial data.
```typescript
import { parse } from 'best-effort-json-parser'
let data = parse(`[1, 2, {"a": "apple`)
console.log(data) // [1, 2, { a: 'apple' }]
```
### Parsing JSON with comments
Multiple types of comments are supported:
```typescript
import { parse } from 'best-effort-json-parser'
let config = parse(`{
"database": {
"host": "localhost", // database server
"port": 5432, /* default port */
"ssl": true
},
"features": ["auth", "api"] <!-- injected by LLM -->
}`)
```
Comments inside strings are preserved and not treated as comments:
```typescript
let data = parse(`{
"inline_comment": "// this is not a comment",
"block_comment": "/* neither is this */",
"html_comment": \`<!-- \${variable} -->\`,
"value": 42
}`)
```
**Note:** The parser also supports template literals with backticks (\`) for strings, in addition to single and double quotes.
### Parsing JSON in markdown code blocks
When LLMs return JSON inside markdown fences, `parse()` extracts the first block automatically:
```typescript
import { parse } from 'best-effort-json-parser'
let llmResponse = `\`\`\`json
[
{"id": 1, "username": "alice"},
{"id": 2, "username": "bob"}
]
\`\`\``
let data = parse(llmResponse)
console.log(data) // [{ id: 1, username: 'alice' }, { id: 2, username: 'bob' }]
```
Both ` ```json ` and plain ` ``` ` fences are supported. If no fence is found, the input is parsed as-is.
When the response contains multiple fenced blocks, loop on `parse.lastParseReminding` to parse each block until it's empty.
Text after fences is also parsed. Most of them will be parsed as string, but substrings like `true` or `123` can become boolean or number, so filter by the JSON shape you expect from the markdown text (e.g. array or object):
Given markdown text with multiple fenced blocks:
````markdown
Part 1:
```json
[
{ "id": 1, "username": "alice" },
{ "id": 2, "username": "bob" }
]
```
Part 2:
```
[
{ "id": 3, "username": "charlie" },
{ "id": 4, "username": "david" }
]
```
Ending text.
````
```typescript
let parts: any[] = []
for (let acc = text; acc; acc = parse.lastParseReminding!) {
parts.push(parse(acc))
}
// expect arrays from the LLM — skip prose parsed as string/number/boolean
parts = parts.filter(part => Array.isArray(part))
// if you expect objects instead:
// parts = parts.filter(part => typeof part === 'object' && part !== null && !Array.isArray(part))
// parts[0] => [{ id: 1, username: 'alice' }, { id: 2, usernaExcerpt of 5,728 characters
Read on GitHubWould you bet a product on this? Bounded 0–100 and slow moving.
matched fp:9207f9f5b8bd0fd3, llm:description: Parse incomplete JSON text in best-effort manner. Useful for partial JSON responses, broken network packages, LLM responses with markdown fences or exceeding token limits, and configuration files with comments.
matched fp:9207f9f5b8bd0fd3, llm:description: Parse incomplete JSON text in best-effort manner. Useful for partial JSON responses, broken network packages, LLM responses with markdown fences or exceeding token limits, and configuration files with comments.