kstm-su / ictsc_2020_yrfw_pre

0 stars 0 forks source link

jsonが壊れた!! #8

Closed zazazazazazazaz closed 3 years ago

zazazazazazazaz commented 3 years ago

概要

GoでAPIサーバを作ってみることにした! しかし、json文字列をparseするときにデータがlossしてしまう。

何故だ...Gopherくん、君はjson壊したりなどしないだろ...?

前提条件

Golang 1.14.6

jsonDataという変数の中身を変更してはならない。

初期状態

VM名 gogo には、golang 1.14.6がインストールされている。 VMのホームディレクトリにはtestcode.go が置かれている。

$ go run testcode.go を実行すると以下の結果が得られる。

実行結果 {10 Gopher 0}

終了状態

コマンド $ go run testcode.go を実行すると

{10 Gopher passwordnohash 99}

上記の結果が得られる。

また、問題の解決が永続化されている。

arsley commented 3 years ago

testcode.go

package main

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

type User struct {
        ID int32 `json="id"`
        Name string `json="name"`
        PasswordHash string `json="password_hash"`
        Count int32 `json="access_count`
}

func main() {
        jsonData := []byte(`
        {
                "id": 10,
                "name": "Gopher",
                "password_hash": "passwordnohash",
                "access_count": 99
        }
        `)

        user := User{}
        err := json.Unmarshal(jsonData, &user)
        if err != nil {
                log.Fatal(err)
        }

        fmt.Println(user)

}
arsley commented 3 years ago

参考

https://shoman.hatenablog.com/entry/2020/03/06/015441 https://noumenon-th.net/programming/2019/09/06/json-unmarshal/

zazazazazazazaz commented 3 years ago

お世話になっております。yrfwです。 この問題では記載ミスが原因でトラブルが発生したと考えられました。そのため以下のように変更し、testcodo.goが{10 Gopher passwordnohash 99}と正しく結果が得られることを確認いたしました。 確認のほどよろしくお願いいたします。

type User struct { ID int32 json="id" Name string json="name" PasswordHash string json="password_hash" Count int32 json="access_count } を以下に変更 type User struct { ID int32 json:"id" Name string json:"name" PasswordHash string json:"password_hash" Count int32 json:”access_count" }