将映射值组合成一个json?
我在学习围棋的过程中,我正在尝试制作一个程序,将网站存储在一个csv列中。然后查询IP地址来自哪个国家 然而,我遇到的问题是,我的JSON显示如下:将映射值组合成一个json?,json,csv,go,Json,Csv,Go,我在学习围棋的过程中,我正在尝试制作一个程序,将网站存储在一个csv列中。然后查询IP地址来自哪个国家 然而,我遇到的问题是,我的JSON显示如下: [{"country":"Singapore"}] [{"country":"United States"},{"country":"United States"}] [{"country":"Sin
[{"country":"Singapore"}]
[{"country":"United States"},{"country":"United States"}]
[{"country":"Singapore"},{"country":"Singapore"},{"country":"Singapore"}]
[{"country":"Ireland"},{"country":"Ireland"},{"country":"Ireland"},{"country":"Ireland"}]
但我希望它像这样出现
{"country": "Singapore",
"country": "United States"
"country": "Ireland"
}
www.google.com
www.bing.com
www.pokemon.com
www.yahoo.com
我的CSV文件如下所示
{"country": "Singapore",
"country": "United States"
"country": "Ireland"
}
www.google.com
www.bing.com
www.pokemon.com
www.yahoo.com
这是我的密码
package main
import (
"encoding/csv"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"log"
"net/http"
"os"
)
func closeFile(f *os.File) {
err := f.Close()
if err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
os.Exit(1)
}
}
func main() {
m := make(map[string]string)
result := []map[string]string{}
csvFile, err :=
os.Open("test.csv")
if err != nil {
log.Fatal(err)
}
defer closeFile(csvFile)
reader := csv.NewReader(csvFile)
for {
line, err := reader.Read()
if err == io.EOF {
break
} else if err != nil {
log.Fatal(err)
}
response, err := http.Get(fmt.Sprintf("http://ip-api.com/json/%s?fields=org", line[0]))
if err != nil {
fmt.Println(err)
defer response.Body.Close()
} else {
data, _ := ioutil.ReadAll(response.Body)
err := json.Unmarshal(data, &m)
if err != nil {
panic(err)
}
result = append(result, m)
rest, _ := json.Marshal(result)
fmt.Println(string(rest)) **
}
}
}
我觉得问题是我缺少了一个for:range循环来在打印之前编译所有内容,但我希望有任何反馈来解决这个问题。这是因为Go
地图
有,它们不是值:
映射类型是引用类型,如指针或切片
在循环开始之前,使用make
创建map
并将附加到循环中的列表后,它本质上是指向列表中多次存储的相同基础数据的指针
然后,Unmarshal
将不会创建新映射,它将重用同一指针,这意味着覆盖以前检索到的结果
因此,解决方案
在每次迭代中重新创建地图。只需将m:=make(map[string]string)
行移动到循环中,就在API调用之前。您声称想要的输出不是有效的JSON。首先,必须引用密钥。另一方面,您不能有重复的键。您的编辑删除了不带引号的键,但您仍然有重复的键,因此它仍然是无效的JSON。@Flimzy您可以看到,当我将映射封送到“rest”时,它在运行代码时返回重复的值。为什么呢<代码>[{“国家”:“新加坡”}][{“国家”:“美国”},{“国家”:“美国”}][{“国家”:“新加坡”},{“国家”:“新加坡”},{“国家”:“新加坡”}][{“国家”:“爱尔兰”},{“国家”:“爱尔兰”},{“国家”:“爱尔兰”}]
可能是因为输入有多个值。但我看不到输入。最好简化您的示例,以显示您试图处理的确切数据,而不是从API中提取数据。@Flimzy我在问题中将文本包含在csv文件中。它只有4行不同的网站。第[0]行是指csv文件中的第一列,其中包含网站。因此,基本上它将网站添加到api链接中,如SprintFThank中所示。谢谢你,这确实有效,我很惊讶这是一个如此简单的过程solution@BilalJama很乐意帮忙!