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:
parent
beb504b5a6
commit
144433fc91
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user