Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.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
在Go中解析多个JSON对象_Json_Go - Fatal编程技术网

在Go中解析多个JSON对象

在Go中解析多个JSON对象,json,go,Json,Go,使用encoding/json包可以非常轻松地解析下面这样的对象 [ {"something":"foo"}, {"something-else":"bar"} ] 我面临的问题是当服务器返回多个DICT时,如下所示: {"something":"foo"} {"something-else":"bar"} 无法使用下面的代码对此进行解析 correct_format := strings.Replace(string(resp_body), "}{", "},{", -1

使用
encoding/json
包可以非常轻松地解析下面这样的对象

[ 
    {"something":"foo"},
    {"something-else":"bar"}
]
我面临的问题是当服务器返回多个DICT时,如下所示:

{"something":"foo"}
{"something-else":"bar"}
无法使用下面的代码对此进行解析

correct_format := strings.Replace(string(resp_body), "}{", "},{", -1)
json_output := "[" + correct_format + "]"
我正在尝试解析常见的爬网数据(请参阅)


我该怎么做呢?

似乎每一行都是自己的json对象

您可以使用以下代码将此输出结构化为正确的json:

package main

import (
    "fmt"
    "strings"
)

func main() {
    base := `{"trolo":"lolo"}
{"trolo2":"lolo2"}`

    delimited := strings.Replace(base, "\n", ",", -1)

    final := "[" + delimited + "]"
    fmt.Println(final)
}

现在,您应该能够在
final
上使用
编码/json
库。

另一个选项是逐行解析每个传入行,然后将每个行添加到代码集合(即片段)中。Go为此提供了一行代码

yourCollection := []yourObject{}
scanner := bufio.NewScanner(YOUR_SOURCE)
for scanner.Scan() {
    obj, err := PARSE_JSON_INTO_yourObject(scanner.Text())
    if err != nil {
       // something
    }
    yourCollection = append(yourCollection, obj)
}
if err := scanner.Err(); err != nil {
    fmt.Fprintln(os.Stderr, "reading standard input:", err)
}

假设您的输入实际上是一系列有效的JSON文档,请使用a对其进行解码:

package main

import (
    "encoding/json"
    "fmt"
    "io"
    "log"
    "strings"
)

var input = `
{"foo": "bar"}
{"foo": "baz"}
`

type Doc struct {
    Foo string
}

func main() {
    dec := json.NewDecoder(strings.NewReader(input))
    for {
        var doc Doc

        err := dec.Decode(&doc)
        if err == io.EOF {
            // all done
            break
        }
        if err != nil {
            log.Fatal(err)
        }

        fmt.Printf("%+v\n", doc)
    }
}
游乐场:


如果您的输入确实是问题中显示的内容,那么这不是JSON,您必须编写自己的解析器。

您可以从文件中逐行读取ndjson并对其进行解析,然后对其应用逻辑操作。在下面的示例中,我没有读取文件,而是使用了一个JSON字符串数组

导入(
“编码/json”
“fmt”
)
类型NestedObject结构{
D字符串
E字符串
}
类型OuterObject结构{
一串
B弦
C[]嵌套对象
}
func main(){
myJsonString:=[]字符串{{{“A”:“1”,“B”:“2”,“C”:[{“D”:“100”,“E”:“10”}}}],{“A”:“11”,“B”:“21”,“C”:[{“D”:“1001”,“E”:“101”}}}}}
对于索引,每个:=范围myJsonString{
fmt.Printf(“索引值[%d]为[%v]\n”,每个索引)
var obj外部对象
Unmarshal([]字节(每个),&obj)
fmt.Printf(“a:%v,b:%v,c:%v”,对象a,对象b,对象c)
fmt.Println()
}
}
输出:

Index value [0] is [{"A":"1","B":"2","C":[{"D":"100","E":"10"}]}]
a: 1, b: 2, c: [{100 10}]
Index value [1] is [{"A":"11","B":"21","C":[{"D":"1001","E":"101"}]}]
a: 11, b: 21, c: [{1001 101}]

它不是有效的json,这就是为什么首先将其转换为有效的json,然后对其进行解析。该json根本无法解析,更不用说容易解析了,因为它是无效的。json不是无效的。每一行实际上都包含一个单独的Json对象。请注意,问题中URL处的文档包含一个文本文件(即每行一个Json文档)。对不起,我错误地发布了错误的Json