愛島発電所

QT SOLAR 愛島発電所

本日の発電量
328 kWh
現在の日射量
426 Wh/㎡
現在の外気温
23.5 ℃

(2024/06/20 08:13 更新)

下増田発電所

QT SOLAR 下増田発電所

本日の発電量
32 kWh
現在の日射量
505 Wh/㎡
現在の外気温
26.7 ℃

(2024/06/20 08:04 更新)

北原東発電所

QT SOLAR 北原東発電所

本日の発電量
64 kWh
現在の日射量
589 Wh/㎡
現在の外気温
23.3 ℃

(2024/06/20 07:58 更新)

長久良辺発電所

QT SOLAR 長久良辺発電所

本日の発電量
67 kWh
現在の日射量
583 Wh/㎡
現在の外気温
25.4 ℃

(2024/06/20 08:01 更新)

白坂発電所

QT SOLAR 白坂発電所

本日の発電量
57 kWh
現在の日射量
726 Wh/㎡
現在の外気温
26.8 ℃

(2024/06/20 08:06 更新)

清水沢発電所

QT SOLAR 清水沢発電所

本日の発電量
69 kWh
現在の日射量
676 Wh/㎡
現在の外気温
22.6 ℃

(2024/06/20 08:15 更新)

JSON形式のデータ生成 | Perlで作るサーバーサービス

スカラー、アレイ、ハッシュなどのデータからJavaScriptなどで利用できるJSON形式のデータを生成(整形・変換)します。入れ子(ネスト)にも対応。

得たいデータはこんな感じ。

{
"title":"Biographies",
"list":["Haruna","Yuki","Mayu"],
"biography":{"born":"birth day","height":"body height","measurements":"bust(cup)/waist/hips"},
"biographies":{
"Haruna":{"born":"April 19","height":164,"measurements":["80D","60",86]},
"Mayu":{"born":"March 26","height":156,"measurements":["71A","55",82]},
"Yuki":{"born":"July 15"},"height":164,"measurements":["75C","54",81]}
}

木構造(ツリー)なので、ルートからノードとブランチを辿っていってリーフに到達できる必要があります。要は配列の中に配列があるようなデータ構造ですね。

配列の要素として配列を持つような場合、Perlでは参照を使って表現しますよね。なので、そのような構造をJSONに置き換えます。

要素が数字であった場合、その数字が文字なのか数値なのかの判定はPerl内部での扱いに準じます。

JSON形式のデータを生成するパッケージモジュール。

JsonUtility.pm

package JsonUtility;
sub new
{
my $class = shift;
my $self = {
ref => "",
};
return bless $self, $class;
}
#--------------------------------------------------------------------------------------
# set(送信対象データの参照をセット)
#--------------------------------------------------------------------------------------
sub set
{
my($self) = shift;
$self->{ref} = shift;
}
#--------------------------------------------------------------------------------------
# remove(送信対象データの参照を削除)
#--------------------------------------------------------------------------------------
sub remove
{
my($self) = shift;
if($self->{ref}){
delete($self->{ref});
}
}
# --------------------------------------------------------------------------------------
# JSONデータ作成(再帰)
# --------------------------------------------------------------------------------------
sub _make
{
my $self = shift;
my $ref = shift;
my $json = "";
if(!ref($ref)){
$val = $ref;
unless(defined $val){
return "null";
}
if(($val^$val) eq '0'){
return $val;
}
$val =~ s/("|\/|\\|\r|\n|\t)/\\$1/sg;
return "\"$val\"";
}elsif(ref($ref) eq "SCALAR"){
return $self->_make($$ref);
}elsif(ref($ref) eq "ARRAY" ){
my $val = "[";
foreach(@$ref){
$val .= $self->_make($_);
$val .= ",";
}
$val =~ s/,$//s;
$val .= "]";
return $val;
}elsif(ref($ref) eq "HASH" ){
$json = "{";
foreach my $key ( keys %$ref ) {
my $val = $self->_make($$ref{$key});
$json .= "\"$key\":$val";
$json .=  ",";
}
$json =~ s/,$//s;
$json .= "}";
return $json;
}
return "";
}
# --------------------------------------------------------------------------------------
# JSON形式のデータを得る
# --------------------------------------------------------------------------------------
sub get
{
my($self) = shift;
my($ref) = shift;
if($ref){
return $self->_make($ref);
}elsif($self->{ref}){
return $self->_make($self->{ref});
}
return "";
}
1;

使い方。

#!/usr/bin/perl
use strict;
use warnings;
use JsonUtility;
# JsonUtility
my $js = JsonUtility->new();
my $title = "Biographies";
my @list = ("Haruna", "Yuki", "Mayu");
my %biography = (
"born","birth day",
"height","body height",
"measurements","bust(cup)/waist/hips"
);
my @haruna_measure = ("80D",'60',86);
my @yuki_measure = ("75C",'54',81);
my @mayu_measure = ("71A",'55',82);
my %haruna = (
"born","April 19",
"height",164,
"measurements",\@haruna_measure
);
my %yuki = (
"born","July 15",
"height",164,
"measurements",\@yuki_measure
);
my %mayu = (
"born","March 26",
"height",156,
"measurements",\@mayu_measure
);
my %biographies = (
"Haruna", \%haruna,
"Yuki",  \%yuki,
"Mayu", \%mayu
);
my %data = (
"title", \$title,
"list", \@list,
"biography", \%biography,
"biographies",\%biographies,
);
my $json_string = $js->get(\%data);
print "Content-type:application/json;charset=UTF-8\n\n";
print "$json_string\n";
exit;

  • 変数名とデータ(要素)を追加する。
  • 入れ子(ネスト)を表現したい場合は、要素に参照(リファレンス)を渡す。

Perlのハッシュはデータ配置が不定(配列のように追加した順に並んでいるわけではない)のため、生成されるJSONのデータもキーと値のペアがどのように配置されるかは不定です。

ほとんどの場合、標準実装されているJSON::PPモジュールで事足りるでしょう。このページの自前モジュールはもともと古いバージョンのPerlが残っていた時代に作られたものです。