如何解析字符串以进行结构化并写入文件

时间:2018-11-05 10:17:29

标签: json parsing go struct

我想解析字符串中的schools数组,并想使用golang写入文件。 假设我有一个称为数据的字符串;

{
    "name": "alex",
    "schools": [
        {"location": "xxx" , "year": 2012},
        {"location": "xxx" , "year": 2012},
    ]
}

我想解析它并将学校写入文件。

为了达到目的。我首先将结构写为;

type User struct{
    name string `json:"name"`
    Schools []struct {
        Location string
        Year    int
    }
} 

然后创建一个变量,然后尝试将字符串解析为

var u User
err := json.Unmarshal([]byte(data), &u)


_, err = createdFile.Write(u.Schools)

但这给我错误

cannot use m (type User) as type []byte in argument to createdFile.Write

我该怎么办?我的错误在哪里?

1 个答案:

答案 0 :(得分:0)

我发现了以下两个问题:

  1. 您已通过u.Schools中的type []struct { Location string Year int }而不是[]byte
  2. 您的json数据仍然无效。

这是我的解决方案。由于您没有提供createdFile.Write()详细信息,因此我在这里使用了ioutil软件包。

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
)

var data = `{
    "name": "alex",
    "schools": [
        {"location": "xxx" , "year": 2012},
        {"location": "xxx" , "year": 2012}
    ]
}`

type User struct {
    Name    string `json:"name"`
    Schools []struct {
        Location string
        Year     int
    }
}

func main() {
    var (
        u User
        err error
        schoolsBytes []byte
    )

    if err = json.Unmarshal([]byte(data), &u); err != nil {
        log.Fatalln(err)
    }
    fmt.Println(u.Schools)

    schoolsBytes, err = json.Marshal(u.Schools)
    if err != nil {
        log.Fatalln(err)
    }

    err = ioutil.WriteFile("/tmp/dat1", schoolsBytes, 0777)
    if err != nil {
        log.Fatalln(err)
    }

    dat, err := ioutil.ReadFile("/tmp/dat1")
    if err != nil {
        log.Fatalln(err)
    }
    fmt.Print(string(dat))
}