猿问

自己结构数组的 JSON 编码

我尝试读取一个目录并从文件条目中生成一个 JSON 字符串。但是 json.encoder.Encode() 函数只返回空对象。为了测试,我在 tmp 目录中有两个文件:


test1.js  test2.js 

go程序是这样的:


package main


import (

    "encoding/json"

    "fmt"

    "os"

    "path/filepath"

    "time"

)


type File struct {

    name      string

    timeStamp int64

}


func main() {


    files := make([]File, 0, 20)


    filepath.Walk("/home/michael/tmp/", func(path string, f os.FileInfo, err error) error {


        if f == nil {

            return nil

        }


        name := f.Name()

        if len(name) > 3 {

            files = append(files, File{

                name:      name,

                timeStamp: f.ModTime().UnixNano() / int64(time.Millisecond),

            })


            // grow array if needed

            if cap(files) == len(files) {

                newFiles := make([]File, len(files), cap(files)*2)

                for i := range files {

                    newFiles[i] = files[i]

                }

                files = newFiles

            }

        }

        return nil

    })


    fmt.Println(files)


    encoder := json.NewEncoder(os.Stdout)

    encoder.Encode(&files)

}

它产生的输出是:


[{test1.js 1444549471481} {test2.js 1444549481017}]

[{},{}]

为什么 JSON 字符串为空?


慕神8447489
浏览 149回答 1
1回答

翻阅古今

它不起作用,因为文件结构中的任何字段都没有导出。以下工作正常:package mainimport (    "encoding/json"    "fmt"    "os"    "path/filepath"    "time")type File struct {    Name      string    TimeStamp int64}func main() {    files := make([]File, 0, 20)    filepath.Walk("/tmp/", func(path string, f os.FileInfo, err error) error {        if f == nil {            return nil        }        name := f.Name()        if len(name) > 3 {            files = append(files, File{                Name:      name,                TimeStamp: f.ModTime().UnixNano() / int64(time.Millisecond),            })            // grow array if needed            if cap(files) == len(files) {                newFiles := make([]File, len(files), cap(files)*2)                for i := range files {                    newFiles[i] = files[i]                }                files = newFiles            }        }        return nil    })    fmt.Println(files)    encoder := json.NewEncoder(os.Stdout)    encoder.Encode(&files)}
随时随地看视频慕课网APP

相关分类

Go
我要回答