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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

JSON

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

Q&A

解決済

3回答

7072閲覧

Perlで配列を要素にもつJSONを生成したい

HajimeHamada

総合スコア20

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

JSON

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

0グッド

1クリップ

投稿2017/11/01 23:16

JSONの要素に配列を持ちたいと思っています。JSONの作成にはPerlを使っています。イメージとして以下のようなコードを作ってみましたが、nameの要素が”ARRAY(0xXXXXXX)"などとなるだけで動きません。

Perl

1#!/usr/bin/perl 2 3use strict; 4use JSON; 5use JSON::Types; 6 7my @id = ("0", "1", "2"); 8my @name = (["aaa"], ["bbb", "ccc"], ["ddd", "eee", "fff"]); 9 10my $all_data; 11for(my $i = 0; $i < @id; $i ++){ 12 13 my $json_hashref = { id => string $id[$i], 14 name => string $name[$i]}; 15 push @$all_data, $json_hashref; 16} 17 18# JSONへの変換 19my $json = JSON->new(); 20my $js = $json->encode($all_data); 21 22print $js, "\n";

そもそもJSONの要素に、配列を持つことは可能でしょうか? 可能であれば、Perlで生成する場合どのように書けばいいでしょうか?

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

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

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

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

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

guest

回答3

0

stringを指定しなければそのまま配列を出力しないでしょうか。

perl

1my $json_hashref = { id => string $id[$i], 2 name => $name[$i]};

[{"id":"0","name":["aaa"]},{"id":"1","name":["bbb","ccc"]},{"id":"2","name":["ddd","eee","fff"]}]

投稿2017/11/02 05:37

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

HajimeHamada

2017/11/02 07:35

その通りでした。こちらでも確認しました。てっきりJSONでは配列は扱えないのかと、勘違いしてしまいました。ありがとうございました。
guest

0

ベストアンサー

$name[0]は"aaa"ではなく["aaa"]、つまり、文字列ではなく無名配列へのリファレンスなのです。にもかかわらずstringをかましているので”ARRAY(0xXXXXXX)"のような「文字列」に変換されてしまいます。

リファレンスの扱いで混乱した時はData::Dumperで一つ一つ確認してみるのも手です。下のような感じで。

perl

1#!/usr/bin/perl 2 3use strict; 4use JSON; 5use JSON::Types; 6use Data::Dumper; 7 8my @id = ("0", "1", "2"); 9my @name = (["aaa"], ["bbb", "ccc"], ["ddd", "eee", "fff"]); 10 11my $all_data; 12for(my $i = 0; $i < @id; $i ++){ 13 14 my $json_hashref = { id => string $id[$i], 15 name => $name[$i]}; # <-- FIX !! 16 push @$all_data, $json_hashref; 17} 18 19print "Let's check the structure of $all_data\n"; 20print Dumper $all_data; 21 22my $json = JSON->new(); 23my $js = $json->encode($all_data); 24 25print "Final result\n"; 26print $js, "\n";

投稿2017/11/02 06:29

KojiDoi

総合スコア13671

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

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

HajimeHamada

2017/11/02 07:33

stringのせいでした。失礼しました。少し複雑なデータ形式を使うと混乱することがよくあるので、Data::Dumperも参考になります。ありがとうございました。
guest

0

そもそもJSONの要素に、配列を持つことは可能でしょうか?

はい、可能です。JSONの取り扱いを含めて、下記の記事が参考になると思います。
Perl - JSONモジュール


追記しました
コードについては、suyama様のご回答が適切かと思います。
私の方でも確認させていただきました。どうもありがとうございました。

JSONにおける配列も以下のRFC文書の「2.3. Arrays」で述べられていましたので、規約として仕様はOKなはずです。
RFC4627 - JSON

JSON reference

投稿2017/11/01 23:57

編集2017/11/02 06:15
dodox86

総合スコア9183

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

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

HajimeHamada

2017/11/02 00:11

早速のご回答、ありがとうございます。質問が言葉不足だったかもしれません。 示していただいた記事を読みますと、 '[{"name" : "Ken", "age" : 19}, {"name" : "Ken", "age" : 25}]' というように、各要素を配列で持っているだけのようです。私が実現したいのは、JSONで '[{"name" :[ "Ken"], "age" : 19}, {"name" : ["Satoshi", "Tadashi"], "age" : 25}]' というように、各要素の内側に配列を入れることができるかということなのですが。
dodox86

2017/11/02 06:17

質問の内容を正しく把握し切れていなくてすみません。追記しましたが、回答としてはsuyama様のものが適切かと思います。よろしくお願いします。
HajimeHamada

2017/11/02 07:36

ご丁寧にありがとうございます。規約としてもOKとのこと、大変参考になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問