# JSON Lines

The [JSON Lines](https://jsonlines.org) format is a text format of newline-delimited JSON. In particular:

1. The input must be UTF-8 encoded.
2. Every line must be a valid JSON value.
3. The line separator must be `\n`. As `\r` is silently ignored, `\r\n` is also supported.
4. The final character may be `\n`, but is not required to be one.

!!! example "JSON Text example"

    ```json
    {"name": "Gilbert", "wins": [["straight", "7♣"], ["one pair", "10♥"]]}
    {"name": "Alexa", "wins": [["two pair", "4♠"], ["two pair", "9♠"]]}
    {"name": "May", "wins": []}
    {"name": "Deloise", "wins": [["three of a kind", "5♣"]]}
    ```

JSON Lines input with more than one value is treated as invalid JSON by the [`parse`](../../api/basic_json/parse.md) or
[`accept`](../../api/basic_json/accept.md) functions. To process it line by line, functions like
[`std::getline`](https://en.cppreference.com/w/cpp/string/basic_string/getline) can be used:

!!! example "Example: Parse JSON Text input line by line"

    The example below demonstrates how JSON Lines can be processed.

    ```cpp
    --8<-- "examples/json_lines.cpp"
    ```
    
    Output:

    ```json
    --8<-- "examples/json_lines.output"
    ```

!!! warning "Note"

    Using [`operator>>`](../../api/operator_gtgt.md) like
    
    ```cpp
    json j;
    while (input >> j)
    {
        std::cout << j << std::endl;
    }
    ```
    
    with a JSON Lines input does not work, because the parser will try to parse one value after the last one.

    This is different from parsing a stream of *concatenated* (non-newline-delimited) JSON values, for which
    `operator>>` does work, provided that a value that is a number is followed by whitespace -- see its
    [notes](../../api/operator_gtgt.md#notes) for details.
