2015-10-11 63 views
-4

我嘗試讀取一個目錄,並從文件條目中創建一個JSON字符串。但是json.encoder.Encode()函數只返回空對象。爲了測試我有一個TMP目錄兩個文件:自己的結構數組的JSON編碼

test1.js test2.js 

的圍棋程序是這樣的:

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字符串爲空?

+3

JSON編碼需要像'Name'和'Timestamp' ** **導出字段名。這是重複的。編碼/ json明確聲明只有導出的字段是可解碼的。這在SO上至少有十次被問到。 – Volker

回答

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) 
} 
+0

如果你這樣做,你可以保留原來的名字:'name string \'json:「name」\''和'TimeStamp int64 \''json:「timeStamp」'' - 這對於導出更通俗JSON。 – Snowman