Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多个json对象解组json文件(无效json文件)_Json_Go_Unmarshalling - Fatal编程技术网

使用多个json对象解组json文件(无效json文件)

使用多个json对象解组json文件(无效json文件),json,go,unmarshalling,Json,Go,Unmarshalling,我有一个json文件(file.json),包含以下内容: file.json: {"job": "developer"} {"job": "taxi driver"} {"job": "police"} 该文件的内容与上述内容完全相同(不是有效的json文件) 我想在我的代码中使用数据,但我无法解组这个您拥有的不是单个JSON对象,而是一系列(不相关的)JSON对象。不能使

我有一个json文件(file.json),包含以下内容:

file.json:

{"job": "developer"}
{"job": "taxi driver"}
{"job": "police"}
该文件的内容与上述内容完全相同(不是有效的json文件)


我想在我的代码中使用数据,但我无法解组这个

您拥有的不是单个JSON对象,而是一系列(不相关的)JSON对象。不能使用来解组包含多个(独立)JSON值的内容

用于逐个解码源中的多个JSON值(对象)

例如:

func main() {
    f := strings.NewReader(file)
    dec := json.NewDecoder(f)

    for {
        var job struct {
            Job string `json:"job"`
        }
        if err := dec.Decode(&job); err != nil {
            if err == io.EOF {
                break
            }
            panic(err)
        }
        fmt.Printf("Decoded: %+v\n", job)
    }
}

const file = `{"job": "developer"}
{"job": "taxi driver"}
{"job": "police"}`
哪些输出(在上尝试):

即使您的JSON对象占用源文件中的多行,或者同一行中有多个JSON对象,此解决方案仍然有效


请参阅相关内容:

您可以逐行读取字符串并将其解组:

package main

import (
    "bufio"
    "encoding/json"
    "fmt"
    "strings"
)

type j struct {
    Job string `json:"job"`
}

func main() {
    payload := strings.NewReader(`{"job": "developer"}
{"job": "taxi driver"}
{"job": "police"}`)
    fscanner := bufio.NewScanner(payload)
    for fscanner.Scan() {
        var job j
        err := json.Unmarshal(fscanner.Bytes(), &job)
        if err != nil {
            fmt.Printf("%s", err)
            continue
        }
        fmt.Printf("JOB %+v\n", job)
    }
}
输出:

JOB {Job:developer}
JOB {Job:taxi driver}
JOB {Job:police}

这是脆弱的,因为它取决于两个事实:1)永远不会有格式不同的JSON对象,它会在任何空白块中包含换行符;2) JSON对象中包含的字符串文本中永远不会嵌入换行符。因此,我在这方面使用@icza。如果一行包含多个JSON对象,这也会中断。
JOB {Job:developer}
JOB {Job:taxi driver}
JOB {Job:police}