2014-11-13 119 views
0

我想在main函數上面實現這個數組,但是如何實現? JSON文件的GO語言:讀取文件並將內容轉換爲數組

hosts := []string{"[email protected]", "[email protected]"}

內容:

[email protected]:~/go$ go run reader.go < hosts.txt 
{ 
    { 
     "username":"inanzzz1", 
     "ip":"100.79.154.22" 
    }, 
    { 
     "username":"inanzzz2", 
     "ip":"200.79.190.11" 
    } 
} 

GO文件讀取上面的JSON文件:

package main 

import (
    "os" 
    "bufio" 
    "fmt" 
) 

func main() { 
    r := bufio.NewReader(os.Stdin) 
    line, err := r.ReadString('\n') 
    for i := 1; err == nil; i++ { 
     //fmt.Printf("Line %d: %s", i, line) 
     fmt.Printf(line) 
     line, err = r.ReadString('\n') 
    } 
} 

回答

2

假設你有什麼是JSON數組(第一個和最後{}由[]取代),而不是在這裏HOSTS.TXT描述你有一個工作溶液中的無效JSON:

package main 

import (
    "encoding/json" 
    "fmt" 
    "os" 
) 

type UsernameIp struct { 
    Username string `json:"username"` 
    Ip  string `json:"ip"` 
} 

func main() { 
    j := json.NewDecoder(os.Stdin) 
    var src []UsernameIp 
    j.Decode(&src) 

    var hosts []string 
    for _, h := range src { 
     entry := fmt.Sprintf("%[email protected]%s", h.Username, h.Ip) 
     hosts = append(hosts, entry) 
    } 

    fmt.Println(hosts) 
} 

正確的hosts.txt文件:

[ 
    { 
     "username":"inanzzz1", 
     "ip":"100.79.154.22" 
    }, 
    { 
     "username":"inanzzz2", 
     "ip":"200.79.190.11" 
    } 
] 
+0

當我用'go run json.go BentCoder

+0

您需要有一個有效的JSON文件。如果你通過[linter](http://jsonlint.com)作爲例子傳遞你建議的文件,你會發現它是無效的。一個JSON數組開始和結束'''' – Franchu

+0

非常感謝你。 – BentCoder

0

您可以使用ioutil.ReadFile讀取整個文件作爲一個字符串,是一個json文檔,然後將字符串解組成一個結構體,您將輕鬆訪問該結構體:

type user_ip struct{ 
    username string `json:"username"` 
    ip string  `json:"ip"` 
} 

type jsonStruct struct{ 
    sample []user_ip 
} 


func main() { 

    //you'll have to read file here 
    str := `{ 
       { 
        "username":"inanzzz1", 
        "ip":"100.79.154.22" 
       }, 
       { 
        "username":"inanzzz2", 
        "ip":"200.79.190.11" 
       } 
      }` 

    userIP := jsonStruct{} 

    err := json.Unmarshal(str, &userIP) 
    panic(err) 

    //do what you want with the struct here 
} 
1

你可能應該先解組json,然後迭代結果。 首先 - 使hosts.txt成爲有效的JSON。對於使用[]代替{}

[ 
    { 
     "username":"inanzzz1", 
     "ip":"100.79.154.22" 
    }, 
    { 
     "username":"inanzzz2", 
     "ip":"200.79.190.11" 
    } 
] 

然後和解組。

這裏充滿例如:

包主

進口( 「FMT」 「編碼/ JSON」

FUNC主(){

type host struct { 
    Username string 
    Ip string 
} 

cont := ` [ 
    { 
     "username":"inanzzz1", 
     "ip":"100.79.154.22" 
    }, 
    { 
     "username":"inanzzz2", 
     "ip":"200.79.190.11" 
    } 
] 
` 


// Read file to some byte array. We will use string for this example. 
var arr []host 
err := json.Unmarshal([]byte(cont), &arr) 
if err != nil { 
    fmt.Println(err) 
} 

hosts := make([]string, len(arr)) 
for i, h := range arr { 
    hosts[i] = h.Username + "@" + h.Ip 
} 
fmt.Println(hosts)   

}

+0

我試圖刪除硬編碼的JSON變量並實現「讀取txt文件」功能。那麼我應該如何修改你的代碼。我正在運行它'運行json.go BentCoder

+0

+1,因爲它也適用。 – BentCoder

相關問題