All Projects → RyanMarcus → Dirty Json

RyanMarcus / Dirty Json

Licence: agpl-3.0
A parser for invalid JSON

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to Dirty Json

Json
A C++11 or library for parsing and serializing JSON to and from a DOM container in memory.
Stars: ✭ 205 (+45.39%)
Mutual labels:  json, parse
Json Autotype
Automatic Haskell type inference from JSON input
Stars: ✭ 139 (-1.42%)
Mutual labels:  json, parse
Parse
Go parsers for web formats
Stars: ✭ 224 (+58.87%)
Mutual labels:  json, parse
Daw json link
Static JSON parsing in C++
Stars: ✭ 146 (+3.55%)
Mutual labels:  json, parse
Zipson
JSON parse and stringify with compression
Stars: ✭ 229 (+62.41%)
Mutual labels:  json, parse
Dhooks
A simple python Discord webhook API wrapper
Stars: ✭ 136 (-3.55%)
Mutual labels:  json
Dijon
A Dynamically Typed Scala Json Library
Stars: ✭ 139 (-1.42%)
Mutual labels:  json
Reconfigure
Config-file-to-Python mapping library (ORM).
Stars: ✭ 136 (-3.55%)
Mutual labels:  json
Mjson
C/C++ JSON parser, emitter, JSON-RPC engine for embedded systems
Stars: ✭ 136 (-3.55%)
Mutual labels:  json
Autocser
AutoCSer is a high-performance RPC framework. AutoCSer 是一个以高效率为目标向导的整体开发框架。主要包括 TCP 接口服务框架、TCP 函数服务框架、远程表达式链组件、前后端一体 WEB 视图框架、ORM 内存索引缓存框架、日志流内存数据库缓存组件、消息队列组件、二进制 / JSON / XML 数据序列化 等一系列无缝集成的高性能组件。
Stars: ✭ 140 (-0.71%)
Mutual labels:  json
Yii2 Json Api
Implementation of JSON API specification for the Yii framework
Stars: ✭ 139 (-1.42%)
Mutual labels:  json
React Csv Reader
React component that handles csv file input and its parsing
Stars: ✭ 138 (-2.13%)
Mutual labels:  parse
Fblog
Small command-line JSON Log viewer
Stars: ✭ 137 (-2.84%)
Mutual labels:  json
Cfgdiff
diff(1) all your configs
Stars: ✭ 138 (-2.13%)
Mutual labels:  json
Rq
Record Query - A tool for doing record analysis and transformation
Stars: ✭ 1,808 (+1182.27%)
Mutual labels:  json
Framework
Strongly-typed JavaScript object with support for validation and error handling.
Stars: ✭ 136 (-3.55%)
Mutual labels:  json
Deku
Declarative binary reading and writing: bit-level, symmetric, serialization/deserialization
Stars: ✭ 136 (-3.55%)
Mutual labels:  parse
Noproto
Flexible, Fast & Compact Serialization with RPC
Stars: ✭ 138 (-2.13%)
Mutual labels:  json
Libvirt Hook Qemu
Libvirt hook for setting up iptables port-forwarding rules when using NAT-ed networking.
Stars: ✭ 137 (-2.84%)
Mutual labels:  json
Parse English
English (natural language) parser
Stars: ✭ 137 (-2.84%)
Mutual labels:  parse

dirty-json

Codeship Status for RyanMarcus/dirty-json Coverage Status NPM version

AGPL

npm install dirty-json

A JSON parser that tries to handle non-conforming or otherwise invalid JSON.

You can play around with a demo here: http://rmarcus.info/dirty-json/

You might also be interested in my blog post about the parser.

Turn this:

[5, .5, 'single quotes', "quotes in "quotes" in quotes"]

Into this:

[5,0.5,"single quotes","quotes in \"quotes\" in quotes"]

Why?

We all love JSON. But sometimes, out in that scary place called "the real world", we see something like this:

{ "user": "<div class="user">Ryan</div>" }

Or even something like this:

{ user: '<div class="user">
Ryan
</div>' }

While these are obviously cringe-worthy, we still want a way to parse them. dirty-json provides a library to do exactly that.

Examples

dirty-json does not require object keys to be quoted, and can handle single-quoted value strings.

const dJSON = require('dirty-json');
const r = dJSON.parse("{ test: 'this is a test'}")
console.log(JSON.stringify(r));

// output: {"test":"this is a test"}

dirty-json can handle embedded quotes in strings.

const dJSON = require('dirty-json');
const r = dJSON.parse('{ "test": "some text "a quote" more text"}');
console.log(JSON.stringify(r));

// output: {"test":"some text \"aquote\" more text"}

dirty-json can handle newlines inside of a string.

const dJSON = require('dirty-json');
const r = dJSON.parse('{ "test": "each \n on \n new \n line"}');
console.log(JSON.stringify(r));

// output: {"test":"each \n on \n new \n line"}

Optionally, dirty-json can handle duplicate keys differently from standard JSON.

const dJSON = require('dirty-json');
const r = dJSON.parse('{"key": 1, "key": 2, \'key\': [1, 2, 3]}');
console.log(JSON.stringify(r));
// output: {"key": [1, 2, 3]}

const r = dJSON.parse('{"key": 1, "key": 2, \'key\': [1, 2, 3]}', {"duplicateKeys": true});
console.log(JSON.stringify(r));
// output: { key: { value: { value: 1, next: 2 }, next: [ 1, 2, 3 ] } }

But what about THIS ambiguous example?

Since dirty-json is handling malformed JSON, it will not always produce the result that you "think" it should. That's why you should only use this when you absolutely need it. Malformed JSON is malformed for a reason.

How does it work?

Currently dirty-json uses a lexer powered by lex and a hand-written LR(1) parser. It shouldn't be used in any environment that requires reliable or fast results.

Security concerns

This package makes heavy use of regular expressions in its lexer. As a result, it may be vulnerable to a REDOS attack. Versions prior to 0.5.1 and after 0.0.5 were definitely vulnerable (thanks to Jamie Davis for pointing this out). I believe version 0.5.1 and later are safe, but since I do not know of any tool to verify a RegEx, I can't prove it.

Acknowledgements

Thanks to user Moai- and 0x0a0dfor fixing array prototype leakage.

License

Copyright 2020, 2018, 2016, 2015, 2014 Ryan Marcus dirty-json is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

dirty-json is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License along with dirty-json. If not, see http://www.gnu.org/licenses/.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].