質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

2989閲覧

js JSON形式の値を取得する際に和名より取得してよいか

kou0225

総合スコア9

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

3クリップ

投稿2021/11/21 15:10

仮に下記のようなJSOnデータが存在する場合、和名の項目を指定して取得してもよろしいのでしょうか?
ルール?規約のようなものがよくわからず、ご質問させてください。

例:
{ユーザネーム: "ユーザネーム"
メールアドレス: "メールアドレス"}

var sample = jsonオブジェクト.ユーザネーム

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

結論から言うと、キー名に日本語文字列を使っても問題ありません。

まぁ、JavaScript上でソースコード書く人が面倒になるので、
慣習として使ってない現場の方が多いと思います。

どうしてそうなるのか、
その流れを下に纏めておきました。
抜け漏れがあるかもしれないので出来れば問題ないことを確認してください。


{ユーザネーム: "ユーザネーム"

メールアドレス: "メールアドレス"}

JSONは人間が読む事は考慮したファイルフォーマットだが、
エディタ開いて頑張って書くべきではないものというのが私の考えです。

例えばJavaScriptではダブルクォートで括らないキー名は許されますが、
JSONでは許されませんので、それはJSONとしては不正です。

このキー名をしっかりダブルクォートで括らなければならない制約が
JSONの使い勝手をかなり悪くしています。
まぁ、下記で紹介するシンプルなルールを適用した結果そうなったという感じになります。


JSONの公式サイトはこんな感じ

2nd edition, December 2017
ダウンロードリンクを開くと仕様をPDFで表現したものがダウンロードできる

このECMA-404 (2nd)のObjectから引用してきます。

A conforming JSON text is a sequence of Unicode code points that strictly conforms to the JSON grammar defined by this specification.

和訳: 準拠するJSONテキストは、この仕様で定義されているJSON文法に厳密に準拠する一連のUnicodeコードポイントです。

文字コードはUnicodeで記載してねと書いてあります。
Unicodeを使えば日本語を取り扱っても良いってことですね。

肝心のObjectに関しての記述を見ていきましょう。

An object structure is represented as a pair of curly bracket tokens surrounding zero or more name/value pairs.

A name is a string. A single colon token follows each name, separating the name from the value.
A single comma token separates a value from a following name.
和訳: オブジェクト構造は、0個以上の名前/値のペアを囲む中括弧トークンのペアとして表されます。
名前は「String」です。単一のコロントークンが各名前の後に続き、名前と値を区切ります。
単一のコンマトークンは、値を次の名前から区切ります。

Objectに関してはこれがルールの全てです。
{name: value}で記述されており、nameの部分はString型でなければなりません。
ルールはそれだけ、シンプルですが鉄の掟でもあります。

じゃあStringってなんやねんということでStringの定義を見ていきます。

A string is a sequence of Unicode code points wrapped with quotation marks (U+0022).

和訳: Stringは、ダブルクォートで囲まれたUnicodeコードポイントのシーケンスです。

Stringはダブルクォートで始まり、ダブルクォートで閉じる表記です。
中身はUnicodeの0文字以上の集合体で記述してください。
こんな感じの事が書いてありますね。

コードポイントというのが1文字を指しており、
シーケンスが1文字の集合体ということを示しています。
(JavaScriptではStringは配列みたいな挙動をする箇所があり、Stringや配列をひっくるめてシーケンスと呼んだりする事もあります)

2行目以降にダブルクォート内でダブルクォートが使いたくなったらどうすんねん的な、
エスケープ文字のルールの記載等がありますが
今回の質問は「日本語がキー名として使えるのか否か」なので飛ばすとして、
これが大体仕様の全体像となります。


別の切り口も見ていきましょうか。

参考記事: 事実上最後のJSON仕様「RFC 8259」と「ECMA-404 2nd Editon」公開。UTF-8エンコード必須に - Publickey

こちらの記事がJSONの仕様の歴史として良い感じにまとまっていました。

JSON text exchanged between systems that are not part of a closed ecosystem MUST be encoded using UTF-8 [RFC3629].

和訳: クローズドなエコシステムの一部ではないシステム同士でのJSONによるテキストの交換は「UTF-8」を用いてエンコードされなければならない。

目を引いたのはこのくらいですね。
Unicodeの実装の一つであるUTF-8を利用しなさいという感じで覚えれば良いと思います。

「日本語を扱いたい」という視点で考えた際、
UTF-8にはまだ定義されていないレアな漢字があったような?
そういう文字は使えないかもしれませんが、そのくらいですかね。


まとめとしては

  • Objectのキー名はStringである(ダブルクォートの省略も許さない)
  • StringはUnicode(UTF-8)の0文字以上をダブルクォートで包んだものである

このルールしかない以上、
別にObjectのキー名(name)に日本語だろうがロシア語だろうが何を使っても問題ありません。

もし不都合があって使わせたくないのであれば、
「ASCII文字列にしなさい」だとか「a-zA-Z0-9」等の正規表現的な事が書かれているはずです。
そういう記載が見つからないということは大丈夫ってことです。

投稿2021/11/21 17:04

miyabi-sun

総合スコア21203

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kou0225

2021/11/21 18:41

ご回答いただきありがとうございます。 ここまで親切、丁寧に教えていただき、きちんと理解することが出来ました!
wintus

2021/12/02 09:49

ハマりがちなエンコーディングについて触れてる上に、仕様書まで参照してるという、完璧な回答ですね :+1:
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問