Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将映射值组合成一个json?_Json_Csv_Go - Fatal编程技术网

将映射值组合成一个json?

将映射值组合成一个json?,json,csv,go,Json,Csv,Go,我在学习围棋的过程中,我正在尝试制作一个程序,将网站存储在一个csv列中。然后查询IP地址来自哪个国家 然而,我遇到的问题是,我的JSON显示如下: [{"country":"Singapore"}] [{"country":"United States"},{"country":"United States"}] [{"country":"Sin

我在学习围棋的过程中,我正在尝试制作一个程序,将网站存储在一个csv列中。然后查询IP地址来自哪个国家

然而,我遇到的问题是,我的JSON显示如下:

[{"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很乐意帮忙!