JSON编码自己的struct数组

时间:2015-10-11 07:54:45

标签: arrays json struct go encoder

我尝试读取目录并从文件条目中生成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字符串为空?

1 个答案:

答案 0 :(得分:2)

它不起作用,因为File结构中没有任何字段被导出。

以下工作正常:

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("/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)
}