代码之家  ›  专栏  ›  技术社区  ›  Jonah

json中的日期输出来自哪里。编码器?

go
  •  1
  • Jonah  · 技术社区  · 6 年前

    在…的结尾 the JSON and Go blog post 您将发现以下示例程序:

    package main
    
    import (
        "encoding/json"
        "log"
        "os"
    )
    
    func main() {
        dec := json.NewDecoder(os.Stdin)
        enc := json.NewEncoder(os.Stdout)
        for {
            var v map[string]interface{}
            if err := dec.Decode(&v); err != nil {
                log.Println(err)
                return
            }
            for k := range v {
                if k != "Name" {
                    delete(v, k)
                }
            }
            if err := enc.Encode(&v); err != nil {
                log.Println(err)
            }
        }
    }
    

    我用 go build json_decoder.go 然后在bash中像这样运行程序:

    echo '{"Name":"Wednesday","Age":6,"Parents":["Gomez","Morticia"]}' | json_decoder
    

    并收到了以下输出:

    {"Name":"Wednesday"}
    2019/08/17 22:09:20 EOF
    

    第一行输出正是我所期望的。但线路在哪里 2019/08/17 22:09:20 EOF 来自哪里?

    0 回复  |  直到 6 年前
        1
  •  2
  •   peterm    6 年前

    什么时候 EOF 到达解码器后返回 io.EOF 然后由记录器输出 log.Println(err) 加上时间戳。

    你可以查一下 EOF 例如,当像这样解码时

    if err := dec.Decode(&v); err != nil {
        if err != io.EOF {
            log.Println(err)
        }
        return
    }
    

    输出:

    ➜ echo '{"Name":"Wednesday","Age":6,"Parents":["Gomez","Morticia"]}' | ./json_decoder
    {"Name":"Wednesday"}
    
        2
  •  1
  •   Benjamin W.    6 年前
    log.Println(err)
    

    该记录器写入标准错误,并打印每条记录消息的日期和时间。


    你们两个都看到了 stdout stderr 所以:

    1. 解决办法是 重新使用 这个 斯特杜特 到文件(或到另一个管道):

      echo '{"Name":"Wednesday","Age":6,"Parents":["Gomez","Morticia"]}' | ./jsonio > file.json
      

      输出(即 标准错误 ):

      2019/08/17 20:35:40 EOF
      

      然后查看文件内容(即 斯特杜特 ):

      cat file.json 
      
      {"Name":"Wednesday"}
      

    1. 你可以放弃 标准错误 (不推荐,但出于测试目的)或重定向 标准错误 :

      echo '{"Name":"Wednesday","Age":6,"Parents":["Gomez","Morticia"]}' | ./jsonio 2>/dev/null
      

      输出(即 斯特杜特 ):

      {"Name":"Wednesday"}
      

    1. 或者不要展示 EOF 根本( 笔记 :您将在中看到其他错误,如不正确的JSON错误 标准错误 ):

      package main
      
      import (
          "encoding/json"
          "io"
          "log"
          "os"
      )
      
      func main() {
          dec := json.NewDecoder(os.Stdin)
          enc := json.NewEncoder(os.Stdout)
          for {
              var v map[string]interface{}
              if err := dec.Decode(&v); err != nil {
                  if err != io.EOF {
                      log.Println(err)
                  }
                  return
              }
              for k := range v {
                  if k != "Name" {
                      delete(v, k)
                  }
              }
              if err := enc.Encode(&v); err != nil {
                  log.Println(err)
              }
          }
      }