p-json 0.1.0

Petr Sabanov's JSON implementation
Documentation
# `p-json` — Petr Sabanov's JSON Parser

[![crates.io version](https://img.shields.io/crates/v/p-json?style=for-the-badge&logo=rust)](https://crates.io/crates/p-json)
[![docs.rs documentation](https://img.shields.io/docsrs/p-json/latest?style=for-the-badge&logo=docs.rs&color=2DA44E)](https://docs.rs/p-json/latest/p-json)
[![GitLab latest release](https://img.shields.io/gitlab/v/release/pasabanov%2Fmy-json?style=for-the-badge&logo=gitlab)](https://gitlab.com/pasabanov/p-json/-/releases/permalink/latest)

Written out of pure interest.

### Features

- No `unsafe`.
- Fully self-contained.
- Clear and minimal API.
- Doesn't require `serde`.

### Disadvantages

- Doesn't accept [UTF-16 surrogate characters]https://en.wikipedia.org/wiki/UTF-16#U+D800_to_U+DFFF_(surrogates).
- Doesn't work with `serde`.

### Usage

To use `p-json` in your project, simply add it to your `Cargo.toml`:

```toml
p-json = "x.y.z"
```

## Examples

### Parsing

```rust
use p_json::{JsonValue, parse};
use indexmap::{IndexMap, indexmap};

fn main() {
	let text = r#"{"id":123,"name":"Alice","active":true}"#;
	let json = parse(text).unwrap();

	assert_eq!(json, JsonValue::Object(indexmap!{
		"id".to_string() => JsonValue::Number(123.0),
		"name".to_string() => JsonValue::String("Alice".to_string()),
		"active".to_string() => JsonValue::Bool(true),
	}));
}
```

### Stringification

```rust
use p_json::{JsonValue, stringify};
use indexmap::{IndexMap, indexmap};

fn main() {
	let mut json = JsonValue::Object(indexmap!{
		"id".to_string() => JsonValue::Number(123.0),
		"name".to_string() => JsonValue::String("Alice".to_string()),
		"active".to_string() => JsonValue::Bool(true),
	});

	let text = stringify(&json);
	assert_eq!(text, r#"{"id":123,"name":"Alice","active":true}"#);
}
```

### Validation

```rust
fn main() {
	let valid = r#"{"key": "value"}"#;
	let invalid = r#"{"key": "value""#;

	assert!(p_json::parse(valid).is_ok());
	assert!(p_json::parse(invalid).is_err());
}
```

## License

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program 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 Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with this program.  If not, see <https://www.gnu.org/licenses/>.

## Copyright

© 2025 Petr Aleksandrovich Sabanov

## Metrics

![crate size](https://img.shields.io/crates/size/p-json?label=crate%20size&color=orange)