在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