2014-09-04 3 views
3

기본적으로 달성하고자하는 것은 os.ReadDir()을 통해 디렉토리의 내용을 가져온 다음 결과를 json으로 인코딩하는 것입니다.golang : JSON으로 마샬링 [] os.FileInfo

직접적으로 json.Marshal()을 수행하면 예외는 아니지만 빈 결과가 나타납니다.

func (f *os.FileInfo) MarshalerJSON() ([]byte, error) { 
    return f.Name(), nil 
} 

그런 다음 이동이 os.FileInfo()가 인터페이스이며,이 방법을 확장 할 수 없음을 알려줍니다 :

그래서 나는이 시도.

이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

답변

4

팩 직렬화 할 수있는 구조체로 데이터 : 여기

http://play.golang.org/p/qDeg2bfik_

type FileInfo struct { 
    Name string 
    Size int64 
    Mode os.FileMode 
    ModTime time.Time 
    IsDir bool 
} 

func main() { 
    dir, err := os.Open(".") 
    if err != nil { 
     log.Fatal(err) 
    } 
    entries, err := dir.Readdir(0) 
    if err != nil { 
     log.Fatal(err) 
    } 

    list := []FileInfo{} 

    for _, entry := range entries { 
     f := FileInfo{ 
      Name: entry.Name(), 
      Size: entry.Size(), 
      Mode: entry.Mode(), 
      ModTime: entry.ModTime(), 
      IsDir: entry.IsDir(), 
     } 
     list = append(list, f) 
    } 

    output, err := json.Marshal(list) 
    if err != nil { 
     log.Fatal(err) 
    } 
    log.Println(string(output)) 

} 
1

사용이 단순 해 보이는하게 다른 버전입니다. 객체로 다시 정렬 할 수는 없지만. 이것은 클라이언트 측이나 다른 사람에게 보내는 경우에만 적용됩니다.

http://play.golang.org/p/vmm3temCUn

사용

output, err := json.Marshal(FileInfo{entry})  

output, err := json.Marshal(FileInfoList{entries}) 

코드

type FileInfo struct { 
    os.FileInfo 
} 

func (f FileInfo) MarshalJSON() ([]byte, error) { 
    return json.Marshal(map[string]interface{}{ 
     "Name": f.Name(), 
     "Size": f.Size(), 
     "Mode": f.Mode(), 
     "ModTime": f.ModTime(), 
     "IsDir": f.IsDir(), 
    }) 
} 

type FileInfoList struct { 
    fileInfoList []os.FileInfo 
} 

//This is inefficient to call multiple times for the same struct 
func (f FileInfoList) MarshalJSON() ([]byte, error) { 
    fileInfoList := make([]FileInfo, 0, len(f.fileInfoList)) 
    for _, val := range f.fileInfoList { 
     fileInfoList = append(fileInfoList, FileInfo{val}) 
    } 

    return json.Marshal(fileInfoList) 
}