从golang中的stdin读取json对象
如何从stdin读取json对象? 我想将一个json对象复制并粘贴到stdin中,读取并解组它。 代码如下:从golang中的stdin读取json对象,json,string,go,stdin,Json,String,Go,Stdin,如何从stdin读取json对象? 我想将一个json对象复制并粘贴到stdin中,读取并解组它。 代码如下: var input string _, err := fmt.Scan(&input) if err != nil { fmt.Println(err) continue } var record MedicalRecord if err := json.Unmarshal([]byte(inpu
var input string
_, err := fmt.Scan(&input)
if err != nil {
fmt.Println(err)
continue
}
var record MedicalRecord
if err := json.Unmarshal([]byte(input), &record); err != nil {
log.Println(err)
continue
}
并将错误打印到控制台
> 2018/06/26 00:26:32 invalid character ':' after top-level value
> 2018/06/26 00:26:32 unexpected end of JSON input
> 2018/06/26 00:26:32 invalid character ':' after top-level value
> 2018/06/26 00:26:32 invalid character ',' after top-level value
> 2018/06/26 00:26:32 invalid character ':' after top-level value
> 2018/06/26 00:26:32 invalid character ',' after top-level value
> 2018/06/26 00:26:32 invalid character ':' after top-level value
> 2018/06/26 00:26:32 invalid character ',' after top-level value
> 2018/06/26 00:26:32 invalid character ':' after top-level value
> 2018/06/26 00:26:32 invalid character ',' after top-level value
如果我没弄错的话,Go正在阅读,直到找到“\n”。如何解决这个问题?当您调用
json.Unmarshal
时,您应该手头有完整的json对象,否则您只是试图解组对解析器毫无意义的部分对象
- 从stdin读入一个足够大的缓冲区,以容纳整个JSON对象
- 解组JSON对象
package main
import (
"bytes"
"io"
"fmt"
"os"
"bufio"
"encoding/json"
)
func main() {
var buf bytes.Buffer
reader := bufio.NewReader(os.Stdin)
for {
line, err := reader.ReadString('\n')
if err != nil {
if err == io.EOF {
buf.WriteString(line)
break // end of the input
} else {
fmt.Println(err.Error())
os.Exit(1) // something bad happened
}
}
buf.WriteString(line)
}
fmt.Printf("valid json? %v\n", json.Valid(buf.Bytes()))
type MedicalRecord struct {
Name string `json:"name"`
Age int `json:"age"`
}
var record MedicalRecord
err := json.Unmarshal(buf.Bytes(), &record)
if err != nil {
fmt.Println(err.Error())
os.Exit(1) // something bad happened
}
fmt.Printf("name: %s, age: %d\n", record.Name, record.Age)
}
使用从io读取器使用JSON。读取器:
package main
import (
"encoding/json"
"log"
"os"
)
type MedicalRecord struct{}
func main() {
var record MedicalRecord
err := json.NewDecoder(os.Stdin).Decode(&record)
if err != nil {
log.Fatal(err)
}
}
您可以通过反复调用Decode来使用多个连续的JSON文档:
package main
import (
"encoding/json"
"io"
"log"
"os"
)
type MedicalRecord struct{}
func main() {
var record MedicalRecord
dec := json.NewDecoder(os.Stdin)
for {
err := dec.Decode(&record)
if err == io.EOF {
return
}
if err != nil {
log.Fatal(err)
}
}
}
如果bufio.NewReader(文件)被bufio.NewReader(os.Stdin)替换,goroutine就会被阻止。我清理了代码以显示完整的工作程序。如果你需要启动一个单独的goroutine,你必须自己去做。