# json.ndjson

> A module of json_mlake's API.

## Structs

### `NDJSONIterator`

```mojo
struct NDJSONIterator[target: StringSpan[ImmStaticOrigin] = StringSpan("cpu")]
```

Lazy iterator over NDJSON lines.

Parses lines on-demand, reducing memory usage for large files.

Implements: `Movable`

#### `__init__`

```mojo
def __init__(out self, data: String)
```

Initialize iterator with NDJSON data.

#### `has_next`

```mojo
def has_next(self) -> Bool
```

Check if there are more JSON values to parse.

#### `next`

```mojo
def next(mut self) -> Value
```

Parse and return the next JSON value.

Raises: Error if no more values or parse error.

#### `count_remaining`

```mojo
def count_remaining(self) -> Int
```

Count remaining non-empty lines without consuming them.

## Functions

### `parse_ndjson`

```mojo
def parse_ndjson[target: StringSpan[ImmStaticOrigin] = StringSpan("cpu")](s: String) -> List[Value]
```

Parse NDJSON (newline-delimited JSON) string into a list of Values.

Each non-empty line is parsed as a separate JSON value.
Empty lines and lines containing only whitespace are skipped.

Example:
var ndjson = '{"a":1}\n{"a":2}\n{"a":3}'
var values = parse_ndjson(ndjson)
print(len(values))  # Prints 3.

Parameters:

- `target`: "cpu" (default) or "gpu" for parsing backend.

Args:

- `s`: NDJSON string with one JSON value per line.

### `parse_ndjson_lazy`

```mojo
def parse_ndjson_lazy[target: StringSpan[ImmStaticOrigin] = StringSpan("cpu")](s: String) -> NDJSONIterator[target]
```

Create a lazy iterator over NDJSON lines.

More memory-efficient than parse_ndjson() for large files
as it only parses one line at a time.

Example:
var iter = parse_ndjson_lazy(ndjson_string)
while iter.has_next():
    var value = iter.next()
    process(value).

Parameters:

- `target`: "cpu" (default) or "gpu" for parsing backend.

Args:

- `s`: NDJSON string with one JSON value per line.

### `dumps_ndjson`

```mojo
def dumps_ndjson(values: List[Value]) -> String
```

Serialize a list of Values to NDJSON format.

Example:
var values = List[Value]()
values.append(loads('{"a":1}'))
values.append(loads('{"a":2}'))
print(dumps_ndjson(values))
Outputs `{"a":1}` and `{"a":2}` on separate lines.

Args:

- `values`: List of Value objects to serialize.
