JSONのobject name(辞書やハッシュ、連想配列におけるキーに相当するもの)の型は文字列のみに限定されています。 [規格書のObjectsのセクション](https://datatracker.ietf.org/doc/html/rfc8259#section-4)には、"A name is a string"と明記されています。 #### Rubyでの検証例 RubyでJSONライブラリを利用した場合でも、当然ですが、以下のようにキーは全て文字列になります。 また、その結果、JSON文字列からRubyのハッシュを再構築すると、元のハッシュと異なったものになってしまいます。 ```ruby require "json" data = {"string" => "String", :symbol => "Symbol", 1 => "Integer"} str = JSON.dump(data) # => "{\"string\":\"String\",\"symbol\":\"Symbol\",\"1\":\"Integer\"}" JSON.parse(str) # => {"string"=>"String", "symbol"=>"Symbol", "1"=>"Integer"} ``` したがって、キーに文字列以外を用いるときには、プログラム側で適宜キャストするなどの対応が必要となります。 その中の対応方法としては、JSONではなく、以下のようにYAMLを使うという手もあります。 ```ruby require "yaml" data = {"string" => "String", :symbol => "Symbol", 1 => "Integer"} str = YAML.dump(data) # => "---\nstring: String\n:symbol: Symbol\n1: Integer\n" YAML.load(str) # => {"string"=>"String", :symbol=>"Symbol", 1=>"Integer"} ``` ただし対応方法の選択においては、セキュリティの観点での注意が必要です。 一般に、JSONよりもYAMLの方が高度な記述が可能であるため、YAMLの方がセキュリティの問題が起きやすいと考えられます。 実際にYAMLを悪用した攻撃手法が知られています。 ですので、ユーザーが任意の記述を送り込めるような場面では、JSONにするかYAMLにするか、はたまたXMLなどの第三の規格にするかの選択において特に慎重な判断が求められます。