登录
首页 >  Golang >  Go问答

日期是从何处输出到json.Encoder中的?

来源:stackoverflow

时间:2024-03-14 11:12:27 378浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《日期是从何处输出到json.Encoder中的?》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

在 json 和 go 博客文章的末尾,您将找到以下示例程序:

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 行来自哪里?


解决方案


当到达 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"}
log.println(err)

您看到的是 stdoutand stderr,所以:

  1. 解决方案是将 stdout 重定向到文件(或另一个管道):

    echo '{"name":"wednesday","age":6,"parents":["gomez","morticia"]}' | ./jsonio > file.json

    输出(即 stderr):

    2019/08/17 20:35:40 eof

    然后查看文件内容(即stdout):

    cat file.json 
    
    {"name":"wednesday"}
  1. 您可以丢弃 stderr (不推荐,但用于测试目的)或重定向 stderr

    echo '{"name":"wednesday","age":6,"parents":["gomez","morticia"]}' | ./jsonio 2>/dev/null

    输出(即 stdout):

    {"name":"wednesday"}
  1. 或者根本不显示 eof注意:您会在 stderr 中看到其他错误,例如不正确的 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)
            }
        }
    }
    
    

本篇关于《日期是从何处输出到json.Encoder中的?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>