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

## 今回はJSONへの出力を扱います
前回はJSONファイルの読み込みを扱いました...前回の記事は下記を参照ください('ω')
[そろそろJSONの扱い方に慣れておこう...その1](https://qiita.com/reinsF82/items/06f5a720353f5cecbde5)

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

### 出力される予定の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ファイルの取扱いあれこれ](https://qiita.com/wakaba130/items/5f54aed913156dc4438f)

```py
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](https://qiita-image-store.s3.amazonaws.com/0/331462/b9e851c6-08b2-f812-fa3a-3fe10ede8f57.png)
実際にjsonファイルの中身を見てみます('ω')
![127.0.0.1_8884_edit_program_python_jupyter-notebook_notebooks_test_test_write.json.png](https://qiita-image-store.s3.amazonaws.com/0/331462/06ecbaef-ea3c-8017-6cc8-7c81824e4dd3.png)
予定通りにjsonが出力できました(*‘∀‘)

### サンプルコード（コメントでご指摘いただいた書き方）
コメントでご指摘いただいた書き方が以下になります(*‘∀‘)

```py
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](https://qiita-image-store.s3.amazonaws.com/0/331462/d69bbbf7-8c7c-770e-1139-d17f9d0d3e09.png) 

## GoでJSONファイルに出力
Goでも同様にjsonに出力してみようとしましたが...結構苦戦しました( ﾟДﾟ) 下記の参照先を参考にしてjsonを出力するコードを書いてみました('ω')
- [Go言語でJSONの生成を構造体無しでJavaScript並に簡単に生成できる方法](https://qiita.com/nasu_st/items/2c456aae4f65d3318d73)
- [Go by Example: Maps](https://gobyexample.com/maps)
- [Go言語の基本 — array と slice の違い](https://qiita.com/YumaInaura/items/aec7857518102ff5e27c)

### サンプルコード（修正前）
```go

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の初期化がツライ](https://qiita.com/kiida/items/e465ad268bbacf529432)

```go
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/"
    }
}
>
```