見出し画像

JSONって「文字列」だったの?

エンジニアなら一度は聞いたことがある「JSON」。
「API叩いて、JSON取ってきた〜!」なんて会話、よくありますよね。

自分は昔、APIを叩けばJSONがそのまま使える状態で返ってくると思っていたんですが、実はそうじゃなかったんです。
同じような経験をしたことがある方もいるんじゃないでしょうか?

実際のところ、返ってきているのは“ただの文字列”。
そのままでは扱えないので、「パース(解析)」して、プログラムで使える“データ”に変換する必要があるんですね。

しかもこの「文字列 → データ」への変換方法は、使うプログラミング言語によって少しずつ違います。
Node.js、Python、Goなどを見比べてみると、それぞれに特徴があって意外と面白いんです。

ということで今回は、「JSONの受け取り方&使い方」を言語ごとに整理していきます!


🍎 一見オブジェクト、でも中身は文字列

たとえば、こんなJSONを見たことがある人は多いと思います。

{
  "name": "Momo",
  "age": 18
}

この形、パッと見た感じ「オブジェクト」に見えますよね。
でも実は、これって**“文字列”として送られてきてる**んです。

たとえるなら、誰かからもらったプレゼントが包み紙でくるまれて届くようなもの。
中に何が入ってるかをちゃんと使うには、まず包みを開けて中身を取り出す=データを変換する必要があるんです。


📥 通信の基本は「文字のやり取り」

そもそもインターネットの通信って、すべてが文字列のやりとりなんですよね。
画像や動画、HTMLのページ、JSONなど、いろんなデータがありますが、それらはぜんぶ**「テキスト(またはバイト列)」**として送受信されています。

たとえば:

  • 写真 → バイナリの文字列として送信

  • HTML → 文字としてブラウザに届く

  • JSON → 構造を持ったテキストとして送受信される

この中でJSONは、ただの文字列じゃなくて**「ちゃんと構造がある文字列」**というのがポイント。
人にも機械にも扱いやすいから、APIでも広く使われているんですね。


🌐 各言語で「包みを開ける」方法は?

言語ごとに、「このJSON文字列を中身のデータとして使いたい!」っていうときの手順があります。
それを順番に見ていきましょう。


🧪 Node.js(JavaScript)の場合

Node.jsでは、JSON.parse() を使って文字列をオブジェクトに変えます。

(1) まずは文字列として受け取って…

const jsonStr = '{"name": "Momo", "age": 18}';
const data = JSON.parse(jsonStr);  // ← ここで変換!

console.log(data.name);  // Momo

(2) fetch()でAPIから取ってくるときも同じ。
中身を .text() で文字列として取り出し、JSON.parse() で変換します。

でも最近は .json() を使えば中で勝手にやってくれるので、もっとシンプル👇

fetch("https://api.example.com/user")
  .then(res => res.json())  // ← ここで自動で変換
  .then(data => {
    console.log(data.name);
  });

🐍 Pythonの場合

Pythonには、json という頼れる標準ライブラリがいます。
やることは json.loads()。
これは “load string(文字列を読み込む)” の略と思えばわかりやすいです。

import json

json_str = '{"name": "Momo", "age": 18}'
data = json.loads(json_str)

print(data["name"])  # Momo

箱を開ける作業が、json.loads() って感じですね。


🐹 Go(Golang)の場合

Goはちょっと独特ですが、基本は同じ。
文字列(あるいは []byte)として受け取ったJSONを json.Unmarshal() で構造体に変換します。

package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	jsonStr := `{"name": "Momo", "age": 18}`
	var user User

	err := json.Unmarshal([]byte(jsonStr), &user)
	if err != nil {
		fmt.Println("エラー:", err)
		return
	}

	fmt.Println(user.Name)  // Momo
}

Goの場合は、まるで中身が決まった箱(struct)に、ぴったりはめていく作業
柔軟に扱いたいときは map[string]interface{} も使えます。


🔄 データを「また文字列に戻す」ときは?

逆に、オブジェクトや構造体からJSON文字列を作るときもありますよね。
例えばAPIに送るときとか、ファイルに書き出すとき。

そのときはこんな風にします:

  • Node.js → JSON.stringify()

  • Python → json.dumps()

  • Go → json.Marshal()

つまり、データと文字列を行ったり来たりできるようにするのが、これらの関数たちの役割です。


📌 まとめ

  • JSONは「最初は文字列」として届く

  • ネット上のデータ通信はすべて「テキスト(バイト列)」で行われている

  • JSONはその中でも**「構造を持ったテキスト」**だから扱いやすい

  • 各言語では、その文字列をプログラムが扱える形に変換するのが基本

  • 出力するときもまた「文字列」に戻して送る


実際にAPIを触ってみると、「あっ、ほんとに文字列で来るんだな〜」って体感できます。
Goでファイルから読み込むパターンなんかも、やってみると面白いので、気になる方はぜひ声かけてくださいね。


JSONって、ちょっとした手間で中身が見える「プレゼント」みたいなもの。
言語によって開け方は違っても、基本の考え方は同じです。
気軽に触って、いろんな場面で使ってみてください!

いいなと思ったら応援しよう!

コメント

コメントするには、 ログイン または 会員登録 をお願いします。
買うたび 抽選 ※条件・上限あり \note クリエイター感謝祭ポイントバックキャンペーン/最大全額もどってくる! 12.1 月〜1.14 水 まで
JSONって「文字列」だったの?|toshi
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1