将所有数据保存到 json 文件但只获取最后一个索引
Save all data into json file but getting only last index
首先我尝试从 URL 获取数据然后再次 运行 相同 URL 但使用新参数,这些参数从第一个 URL 存储然后再次获取来自新 URL 的数据,然后尝试将所有数据存储在 JSON 文件中,但这只存储最后一个值。
我想将所有数据保存到 JSON 文件
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net"`enter code here`
"net/http"
"os"
"strings"
)
type Domains struct {
Domain string `json:"domain"`
IP string `json:"ip"`
}
func main() {
//fetching body of the given url
url, err := http.Get("http://s.tutree.com:7635/v1/groups")
Error(err)
defer url.Body.Close()
body, err := ioutil.ReadAll(url.Body)
Error(err)
converter := string(body)
trimdata := strings.Split(converter, "\n")
// fmt.Println(trimdata)
for _, data := range trimdata {
urls, err := http.Get("http://s.tutree.com:7635/v1/" + data)
Error(err)
defer urls.Body.Close()
data, err := ioutil.ReadAll(urls.Body)
Error(err)
converter := string(data)
trim := strings.Split(converter, "\n")
// fmt.Println(converter)
for _, domains := range trim {
// fmt.Println(string(domains))
convertdomain2ip(string(domains))
// writeFile(domains)
}
}
// fmt.Println("file written successfully")
os.Exit(0)
}
func Error(err error) {
if err != nil {
log.Println(err)
}
}
//Write data into json file
func convertdomain2ip(name string) {
addr, err := net.ResolveIPAddr("ip", name)
if err != nil {
fmt.Println("Resolution error", err.Error())
// os.Exit()
}
typeconvert := addr.String()
var data []Domains
// for _, names := range trimagain {
data = append(data, Domains{
Domain: name,
IP: typeconvert,
})
// }
write, _ := json.MarshalIndent(data, "", "")
// fmt.Println(string(write))
_ = ioutil.WriteFile("domain2ip.json", write, 0644)
fmt.Println("domain=" + name + "\t" + "ip=" + addr.String())
}```
基本上我认为问题在于,每次写入文件时都需要重新创建文件。使用 APPEND 模式打开文件,然后写入文件即可。我还稍微重构了代码以消除代码重复。所以只是一点点清理。
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net"
"net/http"
"os"
"strings"
)
const (
filename string = "domain2ip.json"
)
type DomainIP struct {
Domain string `json:"domain"`
IP string `json:"ip"`
}
func main() {
trimdata := lines(fetchUrl("http://s.tutree.com:7635/v1/groups"))
// fmt.Println(trimdata)
for _, data := range trimdata {
trim := lines(fetchUrl("http://s.tutree.com:7635/v1/" + data))
// fmt.Println(trim)
for _, domains := range trim {
// fmt.Println(string(domains))
domainIP, err := convertdomain2ip(string(domains))
if (err == nil) {
appendToFile(filename, domainIP)
}
}
}
// fmt.Println("file written successfully")
os.Exit(0)
}
func fetchUrl(url string) string {
result, err := http.Get(url)
Error(err)
defer result.Body.Close()
body, err := ioutil.ReadAll(result.Body)
Error(err)
return string(body)
}
func lines(s string) []string {
return strings.Split(s, "\n")
}
func Error(err error) {
if err != nil {
log.Println(err)
}
}
func convertdomain2ip(name string) (*DomainIP, error) {
addr, err := net.ResolveIPAddr("ip", name)
if err != nil {
fmt.Println("Resolution error", err.Error())
return nil, err
}
typeconvert := addr.String()
return &DomainIP{
Domain: name,
IP: typeconvert}, nil
}
func appendToFile(filename string, data interface{}) {
jsonData, _ := json.MarshalIndent(data, "", "")
// fmt.Println(string(write))
f, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Println(err)
}
defer f.Close()
if _, err := f.Write(jsonData); err != nil {
log.Println(err)
}
}
尽管如此,要使生成的文件成为有效的 JSON 文档,您必须用逗号分隔条目并将值放入 JSON 数组(将 [
放在文件的开头和结尾的 ]
。
如果内存没问题,你也可以聚合所有DomainIP
个对象,最后写入文件。然后你甚至可以使用你以前的 write 例程,但在 main 方法的末尾。
注1
我的代码将附加到文件并仅在文件不存在时创建它。这意味着,您必须注意 运行 应用程序多次,如果您不先将其删除,数据将始终附加到原始文件。
注2
另一种选择是简单地写入 stdout
而不是文件并将结果发送到带有 >
的文件中。但这仅适用于 bash 类环境,就像您在 Linux 或 MacOS 中一样。
go run main.go > domain2ip.json
首先我尝试从 URL 获取数据然后再次 运行 相同 URL 但使用新参数,这些参数从第一个 URL 存储然后再次获取来自新 URL 的数据,然后尝试将所有数据存储在 JSON 文件中,但这只存储最后一个值。 我想将所有数据保存到 JSON 文件
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net"`enter code here`
"net/http"
"os"
"strings"
)
type Domains struct {
Domain string `json:"domain"`
IP string `json:"ip"`
}
func main() {
//fetching body of the given url
url, err := http.Get("http://s.tutree.com:7635/v1/groups")
Error(err)
defer url.Body.Close()
body, err := ioutil.ReadAll(url.Body)
Error(err)
converter := string(body)
trimdata := strings.Split(converter, "\n")
// fmt.Println(trimdata)
for _, data := range trimdata {
urls, err := http.Get("http://s.tutree.com:7635/v1/" + data)
Error(err)
defer urls.Body.Close()
data, err := ioutil.ReadAll(urls.Body)
Error(err)
converter := string(data)
trim := strings.Split(converter, "\n")
// fmt.Println(converter)
for _, domains := range trim {
// fmt.Println(string(domains))
convertdomain2ip(string(domains))
// writeFile(domains)
}
}
// fmt.Println("file written successfully")
os.Exit(0)
}
func Error(err error) {
if err != nil {
log.Println(err)
}
}
//Write data into json file
func convertdomain2ip(name string) {
addr, err := net.ResolveIPAddr("ip", name)
if err != nil {
fmt.Println("Resolution error", err.Error())
// os.Exit()
}
typeconvert := addr.String()
var data []Domains
// for _, names := range trimagain {
data = append(data, Domains{
Domain: name,
IP: typeconvert,
})
// }
write, _ := json.MarshalIndent(data, "", "")
// fmt.Println(string(write))
_ = ioutil.WriteFile("domain2ip.json", write, 0644)
fmt.Println("domain=" + name + "\t" + "ip=" + addr.String())
}```
基本上我认为问题在于,每次写入文件时都需要重新创建文件。使用 APPEND 模式打开文件,然后写入文件即可。我还稍微重构了代码以消除代码重复。所以只是一点点清理。
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net"
"net/http"
"os"
"strings"
)
const (
filename string = "domain2ip.json"
)
type DomainIP struct {
Domain string `json:"domain"`
IP string `json:"ip"`
}
func main() {
trimdata := lines(fetchUrl("http://s.tutree.com:7635/v1/groups"))
// fmt.Println(trimdata)
for _, data := range trimdata {
trim := lines(fetchUrl("http://s.tutree.com:7635/v1/" + data))
// fmt.Println(trim)
for _, domains := range trim {
// fmt.Println(string(domains))
domainIP, err := convertdomain2ip(string(domains))
if (err == nil) {
appendToFile(filename, domainIP)
}
}
}
// fmt.Println("file written successfully")
os.Exit(0)
}
func fetchUrl(url string) string {
result, err := http.Get(url)
Error(err)
defer result.Body.Close()
body, err := ioutil.ReadAll(result.Body)
Error(err)
return string(body)
}
func lines(s string) []string {
return strings.Split(s, "\n")
}
func Error(err error) {
if err != nil {
log.Println(err)
}
}
func convertdomain2ip(name string) (*DomainIP, error) {
addr, err := net.ResolveIPAddr("ip", name)
if err != nil {
fmt.Println("Resolution error", err.Error())
return nil, err
}
typeconvert := addr.String()
return &DomainIP{
Domain: name,
IP: typeconvert}, nil
}
func appendToFile(filename string, data interface{}) {
jsonData, _ := json.MarshalIndent(data, "", "")
// fmt.Println(string(write))
f, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Println(err)
}
defer f.Close()
if _, err := f.Write(jsonData); err != nil {
log.Println(err)
}
}
尽管如此,要使生成的文件成为有效的 JSON 文档,您必须用逗号分隔条目并将值放入 JSON 数组(将 [
放在文件的开头和结尾的 ]
。
如果内存没问题,你也可以聚合所有DomainIP
个对象,最后写入文件。然后你甚至可以使用你以前的 write 例程,但在 main 方法的末尾。
注1 我的代码将附加到文件并仅在文件不存在时创建它。这意味着,您必须注意 运行 应用程序多次,如果您不先将其删除,数据将始终附加到原始文件。
注2
另一种选择是简单地写入 stdout
而不是文件并将结果发送到带有 >
的文件中。但这仅适用于 bash 类环境,就像您在 Linux 或 MacOS 中一样。
go run main.go > domain2ip.json