2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-19 00:26:03 +00:00

98_JsonMod.pm: #109413: property with deeplinks

git-svn-id: https://svn.fhem.de/fhem/trunk@21515 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
herrmannj 2020-03-25 19:40:53 +00:00
parent beb504b5a6
commit 144433fc91

View File

@ -277,13 +277,13 @@ sub JsonMod_DoReadings {
my sub jsonPathf { my sub jsonPathf {
# https://forum.fhem.de/index.php/topic,109413.msg1034685.html#msg1034685 # https://forum.fhem.de/index.php/topic,109413.msg1034685.html#msg1034685
no if $] >= 5.022, q|warnings|, qw( redundant missing ); no if $] >= 5.022, 'warnings', qw( redundant missing );
#eval 'no warnings qw( redundant missing )' if ($] >= 5.22); #eval 'no warnings qw( redundant missing )' if ($] >= 5.22);
my ($jsonPathExpression, $format) = @_; my ($jsonPathExpression, $format) = @_;
$format //= '%s'; $format //= '%s';
my $value = $path->get($jsonPathExpression)->getResultValue(); my $value = $path->get($jsonPathExpression)->getResultValue();
#$path->get($jsonPathExpression)->getResultNormVal(); #$path->get($jsonPathExpression)->getResultNormVal();
$value = $value->[0] if (ref($value) eq 'ARRAY' and scalar(@{$value}) > 0); $value = $value->[0] if (ref($value) eq 'ARRAY' and scalar(@{$value}));
if (defined($value)) { if (defined($value)) {
return sprintf($format, $value); return sprintf($format, $value);
} else { } else {
@ -296,16 +296,6 @@ sub JsonMod_DoReadings {
return $path->get($jsonPathExpression)->getResultValue(); return $path->get($jsonPathExpression)->getResultValue();
}; };
# depraced
my sub singleReading {
my ($reading, $value, $default) = @_;
$value = $value->[0] if (ref($value) eq 'ARRAY' and scalar(@{$value}) > 0);
$value //= $default;
$newReadings->{$reading} = $value;
$oldReadings->{$reading} = 1;
return;
};
my sub concat { my sub concat {
my @args = @_; my @args = @_;
return sub { return sub {
@ -324,65 +314,105 @@ sub JsonMod_DoReadings {
}; };
}; };
# my sub propertyf {
# my ($p, $default, $format) = @_;
# $default //= '';
# $format //= '';
# return sub {
# my ($o) = @_;
# if (ref($o) eq 'CODE') {
# return $o->($p, $default);
# } elsif (ref($o) eq 'HASH') {
# my $result = $o->{$p} if (exists($o->{$p}));
# if (defined($result)) {
# if (ref($result) eq '') {
# return sprintf ($format, $result);
# } else {
# return $result;
# };
# } else {
# return $default;
# };
# } elsif (ref($o) eq 'ARRAY') {
# my $result = $o->[$p] if ((scalar @{$o}) > ($p + 0));
# if (defined($result)) {
# if (ref($result) eq '') {
# return sprintf ($format, $result);
# } else {
# return $result;
# };
# } else {
# return $default;
# };
# } elsif (ref($o) eq '') {
# return $o;
# } else {
# die('syntax');
# };
# };
# };
my sub propertyf { my sub propertyf {
my ($p, $default, $format) = @_; my ($propertyPath, $default, $format) = @_;
$default //= ''; $default //= '';
$format //= ''; $format //= '%s';
return sub { return sub {
my ($o) = @_; my ($o) = @_;
if (ref($o) eq 'CODE') { $propertyPath = $propertyPath->($o) if (ref($propertyPath) eq 'CODE');
return $o->($p, $default); $default = $default->($o) if (ref($default) eq 'CODE');
} elsif (ref($o) eq 'HASH') { $format = $format->($o) if (ref($format) eq 'CODE');
my $result = $o->{$p} if (exists($o->{$p}));
if (defined($result)) { if (ref($o) eq 'HASH' or ref($o) eq 'ARRAY') {
if (ref($result) eq '') { my $presult = JsonMod::JSON::Path->new($o)->get($propertyPath)->getResultValue();
return sprintf ($format, $result); if (defined($presult)) {
} else { if (ref($presult) eq 'ARRAY') {
return $result; if (scalar(@{$presult})) {
}; no if $] >= 5.022, 'warnings', qw( redundant missing );
return sprintf($format, $presult->[0]); # the first element if multiple. be gentle ;)
} else { } else {
return $default; return $default;
}; };
} elsif (ref($o) eq 'ARRAY') {
my $result = $o->[$p] if ((scalar @{$o}) > ($p + 0));
if (defined($result)) {
if (ref($result) eq '') {
return sprintf ($format, $result);
} else { } else {
return $result; return $presult;
};
}; };
} else { } else {
return $default; no if $] >= 5.022, 'warnings', qw( redundant missing );
}; return sprintf($format, $o);
} elsif (ref($o) eq '') { # die("something went wrong while processing the JsonMod property '$propertyPath'. pls report it");
return $o;
} else {
die('syntax');
}; };
}; };
}; };
my sub property { my sub property {
my ($p, $default) = @_; my ($propertyPath, $default) = @_;
$default //= ''; $default //= '';
return sub { return sub {
my ($o) = @_; my ($o) = @_;
if (ref($o) eq 'CODE') { $propertyPath = $propertyPath->($o) if (ref($propertyPath) eq 'CODE');
return $o->($p, $default); $default = $default->($o) if (ref($default) eq 'CODE');
} elsif (ref($o) eq 'HASH') {
return $o->{$p} if (exists($o->{$p})); if (ref($o) eq 'HASH' or ref($o) eq 'ARRAY') {
return $default; my $presult = JsonMod::JSON::Path->new($o)->get($propertyPath)->getResultValue();
} elsif (ref($o) eq 'ARRAY') { if (defined($presult)) {
return $o->[$p] if ((scalar @{$o}) > ($p + 0)); if (ref($presult) eq 'ARRAY') {
return $default; if (scalar(@{$presult})) {
} elsif (ref($o) eq '') { return $presult->[0]; # the first hit if many. be gentle ;)
return $o;
} else { } else {
die('syntax'); return $default;
};
} else {
return $presult;
};
};
} else {
return $o;
# die("something went wrong while processing the JsonMod property '$propertyPath'. pls report it");
}; };
}; };
}; };
my $_index = 0; my $_index = 0;
my sub index { my sub index {
#my $index = 0; #my $index = 0;
@ -412,9 +442,11 @@ sub JsonMod_DoReadings {
# value (mostly jsonPath) / reading name / default if value is not available # value (mostly jsonPath) / reading name / default if value is not available
my sub single { my sub single {
my ($value, $reading, $default) = @_; my ($value, $reading, $default) = @_;
$value = $value->[0] if (ref($value) eq 'ARRAY' and scalar(@{$value}) > 0); $value = $value->() if (ref($value) eq 'CODE');
#use Data::Dumper; $reading = $reading->() if (ref($reading) eq 'CODE');
#print $value; $default = $default->() if (ref($default) eq 'CODE');
$value = $value->[0] if (ref($value) eq 'ARRAY' and scalar(@{$value}));
$value //= $default; $value //= $default;
$newReadings->{$reading} = $value; $newReadings->{$reading} = $value;
$oldReadings->{$reading} = 1; $oldReadings->{$reading} = 1;
@ -560,7 +592,7 @@ sub JsonMod_Logger {
my ($hash, $verbose, $message, @args) = @_; my ($hash, $verbose, $message, @args) = @_;
my $name = $hash->{'NAME'}; my $name = $hash->{'NAME'};
# https://forum.fhem.de/index.php/topic,109413.msg1034685.html#msg1034685 # https://forum.fhem.de/index.php/topic,109413.msg1034685.html#msg1034685
no if $] >= 5.022, q|warnings|, qw( redundant missing ); no if $] >= 5.022, 'warnings', qw( redundant missing );
#eval 'no warnings qw( redundant missing )' if ($] >= 5.22); #eval 'no warnings qw( redundant missing )' if ($] >= 5.22);
Log3 ($name, $verbose, sprintf('[%s] '.$message, $name, @args)); Log3 ($name, $verbose, sprintf('[%s] '.$message, $name, @args));
return; return;
@ -893,10 +925,13 @@ use strict;
use warnings; use warnings;
use utf8; use utf8;
use Text::Balanced qw ( extract_codeblock extract_delimited ); use Text::Balanced qw ( extract_codeblock extract_delimited );
use Scalar::Util qw( blessed );
sub new { sub new {
my ($class, $o, $root) = @_; my ($class, $o, $root) = @_;
# special case for JSON 'true' / 'false'
$o = "$o" if (blessed($o) and blessed($o) eq 'JSON::PP::Boolean');
my $t = ref($o); my $t = ref($o);
if ($t eq 'HASH') { if ($t eq 'HASH') {
return JsonMod::JSON::Path::HNode->new($o, $root); return JsonMod::JSON::Path::HNode->new($o, $root);