Как разобрать строку, чтобы перейти к структуре и записать в файл - PullRequest
0 голосов
/ 05 ноября 2018

Я хочу проанализировать массив школ в строке и хочу записать в файл с помощью 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 голосов
/ 05 ноября 2018

Я обнаружил следующие две проблемы:

  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))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...