Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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
从golang中的stdin读取json对象_Json_String_Go_Stdin - Fatal编程技术网

从golang中的stdin读取json对象

从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

如何从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(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,你必须自己去做。