LoginSignup
1
1

More than 5 years have passed since last update.

そろそろJSONの扱い方に慣れておこう...その2

Last updated at Posted at 2019-04-07

今回はJSONへの出力を扱います

前回はJSONファイルの読み込みを扱いました...前回の記事は下記を参照ください('ω')
そろそろJSONの扱い方に慣れておこう...その1

PythonでJSONファイルに出力

Pythonでjsonファイルに出力してみます('ω')

出力される予定のJSONファイル

下記のようにjsonファイルが作成されれば成功です('ω')

{
 "kasumi_toyama": {
    "url": "http://bangdream.gamedbs.jp/chara/show/11/"
  },
  "tae_hanazono": {
    "url": "http://bangdream.gamedbs.jp/chara/show/10/"
  },
  "rimi_ushigome": {
    "url": "http://bangdream.gamedbs.jp/chara/show/25/"
  }
}

サンプルコード(修正前)

下記のリンクを参考にさせていただきました。
- PythonにおいてのJSONファイルの取扱いあれこれ

import json
import collections as cl

def main():
    name_list = ["kasumi_toyama", "tae_hanazono", "rimi_ushigome"]
    url = ["http://bangdream.gamedbs.jp/chara/show/11/","http://bangdream.gamedbs.jp/chara/show/10/","http://bangdream.gamedbs.jp/chara/show/25/"]

    json_data = cl.OrderedDict()
    for i in range(len(name_list)):
        data = cl.OrderedDict()
        data["url"] = url[i]

        json_data[name_list[i]] = data

    print("{}".format(json.dumps(json_data,indent=4)))

    json_file = open('./test_write.json','w')

    # json.dump関数でファイルに書き込む
    json.dump(json_data,json_file,indent=4)

if __name__=='__main__':
    main()

実行結果

出力用に用意した辞書の中身を確認すると出来てそうですね('ω')
127.0.0.1_8884_notebooks_program_python_jupyter-notebook_notebooks_test_json_write_test.ipynb.png
実際にjsonファイルの中身を見てみます('ω')
127.0.0.1_8884_edit_program_python_jupyter-notebook_notebooks_test_test_write.json.png
予定通りにjsonが出力できました(*‘∀‘)

サンプルコード(コメントでご指摘いただいた書き方)

コメントでご指摘いただいた書き方が以下になります(*‘∀‘)

import json
from collections import OrderedDict


def main():
    names = ["kasumi_toyama", "tae_hanazono", "rimi_ushigome"]
    urls = ["http://bangdream.gamedbs.jp/chara/show/11/",
            "http://bangdream.gamedbs.jp/chara/show/10/",
            "http://bangdream.gamedbs.jp/chara/show/25/"]

    json_data = OrderedDict()
    for name, url in zip(names, urls):
        json_data[name] = {"url": url}

    print(json.dumps(json_data, indent=4))

    with open('./test_write.json', 'w') as json_file:
        json.dump(json_data, json_file, indent=4)


if __name__ == '__main__':
    main()

実行結果(指摘いただいた書き方で)

自分が書いていた書き方よりも出力されるのが早かった気がします( ゚Д゚)
127.0.0.1_8888_notebooks_test_json_write_test2.ipynb.png

GoでJSONファイルに出力

Goでも同様にjsonに出力してみようとしましたが...結構苦戦しました( ゚Д゚) 下記の参照先を参考にしてjsonを出力するコードを書いてみました('ω')
- Go言語でJSONの生成を構造体無しでJavaScript並に簡単に生成できる方法
- Go by Example: Maps
- Go言語の基本 — array と slice の違い

サンプルコード(修正前)


package main

import (
    "encoding/json"
    "fmt"
)

type M map[string]interface{}

func main() {
    m := make(map[string]interface{})

    urllist := map[string]string{
        "kasumi_toyama": "http://bangdream.gamedbs.jp/chara/show/11/",
        "tae_hanazono":  "http://bangdream.gamedbs.jp/chara/show/10/",
        "rimi_ushigome": "http://bangdream.gamedbs.jp/chara/show/25/",
    }

    for name := range urllist {
        m[name] = M{"url": urllist[name]}
    }

    bytes, err := json.MarshalIndent(m, "", "    ")
    if err == nil {
        jsonstring := string(bytes)
        fmt.Println(jsonstring)
    } else {
        fmt.Println("Err: ", err)
    }
}

実行結果

jsonの読み込みよりも苦戦していましたが、Goでもうまく出力できました('ω')

> go run .\go-simplejson-test-dst2.go
{
    "kasumi_toyama": {
        "url": "http://bangdream.gamedbs.jp/chara/show/11/"
    },
    "rimi_ushigome": {
        "url": "http://bangdream.gamedbs.jp/chara/show/25/"
    },
    "tae_hanazono": {
        "url": "http://bangdream.gamedbs.jp/chara/show/10/"
    }
}
>

サンプルコード(コメントでご指摘いただきましたので、構造体を用いて書き直しました)

下記のサイトを参考に書き直してみました(*‘∀‘)
- golangでnestしたstructの初期化がツライ

package main

import (
    "encoding/json"
    "fmt"
)

type KasumiToyama struct {
    URL string `json:"url"`
}

type TaeHanazono struct {
    URL string `json:"url"`
}

type RimiUshigome struct {
    URL string `json:"url"`
}

type gbplist struct {
    KasumiToyama `json:"kasumi_toyama"`

    TaeHanazono `json:"tae_hanazono"`

    RimiUshigome `json:"rimi_ushigome"`
}

func main() {

    var list = gbplist{
        KasumiToyama: KasumiToyama{
            URL: "http://bangdream.gamedbs.jp/chara/show/11/",
        },
        TaeHanazono: TaeHanazono{
            URL: "http://bangdream.gamedbs.jp/chara/show/10/",
        },
        RimiUshigome: RimiUshigome{
            URL: "http://bangdream.gamedbs.jp/chara/show/25/",
        },
    }

    bytes, err := json.MarshalIndent(list, "", "    ")
    if err == nil {
        jsonstring := string(bytes)
        fmt.Println(jsonstring)
    } else {
        fmt.Println("Err: ", err)
    }
}

実行結果(構造体を用いた場合)

感覚的には、構造体で書いたほうが書きやすかったです('ω')

> go run .\go-simplejson-test-dst3.go
{
    "kasumi_toyama": {
        "url": "http://bangdream.gamedbs.jp/chara/show/11/"
    },
    "tae_hanazono": {
        "url": "http://bangdream.gamedbs.jp/chara/show/10/"
    },
    "rimi_ushigome": {
        "url": "http://bangdream.gamedbs.jp/chara/show/25/"
    }
}
>
1
1
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1