mirror of
https://github.com/therootcompany/golib.git
synced 2025-10-07 01:28:19 +00:00
1.9 KiB
1.9 KiB
JSONL
An example of using encoding/json
's dec.More()
to read JSONL natively.
(because it can read any valid sequence of back-to-back JSON objects)
package main
import (
"encoding/json"
"fmt"
"os"
)
func main() {
decoder := json.NewDecoder(os.Stdin)
var err error
for decoder.More() {
var data any
if err = decoder.Decode(&data); err != nil {
break
}
fmt.Printf("Decoded: %#v\n\n", data)
}
if err != nil {
fmt.Fprintf(os.Stderr, "error decoding JSON: %v\n", err)
}
fmt.Printf("Done\n")
}
Strict JSONL
This will parse strict JSONL.
./messages.jsonl
:
{"name":"Alice","age":25}
{"name":"Bob","age":30}
{"name":"Charlie","age":35}
Decoded: map[string]interface {}{"age":25, "name":"Alice"}
Decoded: map[string]interface {}{"age":30, "name":"Bob"}
Decoded: map[string]interface {}{"age":35, "name":"Charlie"}
Back-to-back JSON
It will also parse... anything else.
./messages.jsonish
:
null
true
false
0
1
"hello"
[2, 11, 37, 42]
{"name":"Alice","age":25}
{
"name":"Bob",
"age":30
}
{
"name":
"Charlie",
"age":
35
}
Decoded: <nil>
Decoded: true
Decoded: false
Decoded: 0
Decoded: 1
Decoded: "hello"
Decoded: []interface {}{2, 11, 37, 42}
Decoded: map[string]interface {}{"age":25, "name":"Alice"}
Decoded: map[string]interface {}{"age":30, "name":"Bob"}
Decoded: map[string]interface {}{"age":35, "name":"Charlie"}
Non-JSON
dec.More()
does not stop after error. You must check the return errors and break out yourself.
{"name":"Alice","age":25}
{"name":"Bob","age":30}
{"name":"Charlie"
Decoded: map[string]interface {}{"age":25, "name":"Alice"}
Decoded: map[string]interface {}{"age":30, "name":"Bob"}
error decoding JSON: unexpected EOF
Done