要在Go中把CSV数据转换为JSON,你应该遵循以下步骤:
- 创建一个用于存储CSV行的结构,并用JSON结构字段标签对其进行注释。
- 读取CSV文件,使用
csv.Reader. - 将原始CSV数据的连续行数分配给所创建的结构的实例。
- 使用软件包中的marshaling函数将结构数组转换为JSON。
encoding/json包中的函数将结构数组转换为JSON。
在下面的例子中,我们使用
data.csv文件。vegetables,fruits,rank carrot,banana,1 potato,strawberry,2
package main
import (
"encoding/csv"
"encoding/json"
"fmt"
"log"
"os"
"strconv"
)
type ShoppingRecord struct {
// 1. Create a struct for storing CSV lines and annotate it with JSON struct field tags
Vegetable string `json:"vegetable"`
Fruit string `json:"fruit"`
Rank int `json:"rank"`
}
func createShoppingList(data [][]string) []ShoppingRecord {
// convert csv lines to array of structs
var shoppingList []ShoppingRecord
for i, line := range data {
if i > 0 { // omit header line
var rec ShoppingRecord
for j, field := range line {
if j == 0 {
rec.Vegetable = field
} else if j == 1 {
rec.Fruit = field
} else if j == 2 {
var err error
rec.Rank, err = strconv.Atoi(field)
if err != nil {
continue
}
}
}
shoppingList = append(shoppingList, rec)
}
}
return shoppingList
}
func main() {
// open file
f, err := os.Open("data.csv")
if err != nil {
log.Fatal(err)
}
// remember to close the file at the end of the program
defer f.Close()
// 2. Read CSV file using csv.Reader
csvReader := csv.NewReader(f)
data, err := csvReader.ReadAll()
if err != nil {
log.Fatal(err)
}
// 3. Assign successive lines of raw CSV data to fields of the created structs
shoppingList := createShoppingList(data)
// 4. Convert an array of structs to JSON using marshaling functions from the encoding/json package
jsonData, err := json.MarshalIndent(shoppingList, "", " ")
if err != nil {
log.Fatal(err)
}
fmt.Println(string(jsonData))
}
输出
[
{
"vegetable": "carrot",
"fruit": "banana",
"rank": 1
},
{
"vegetable": "potato",
"fruit": "strawberry",
"rank": 2
}
]