2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-22 08:11:44 +00:00

fhem.pl: enable json2nameValue to parse arrays on the top level (Forum #108786)

git-svn-id: https://svn.fhem.de/fhem/trunk@21297 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2020-02-27 22:01:20 +00:00
parent 7c207fe6a5
commit 320de372dc
2 changed files with 25 additions and 19 deletions

View File

@ -219,7 +219,7 @@ MQTT2_DEVICE_Parse($$)
my $cidArr = $modules{MQTT2_DEVICE}{defptr}{cid}{$newCid};
return if(!$cidArr);
my $add;
if(length($value) < 10000 && $value =~ m/^\s*{.*}\s*$/s) {
if(length($value) < 10000 && $value =~ m/^\s*[{[].*[}\]]\s*$/s) {
my $ret = json2nameValue($value);
if(keys %{$ret}) {
$topic =~ m,.*/([^/]+),;

View File

@ -5163,9 +5163,9 @@ json2nameValue($;$$)
sub eObj($$$$$$);
sub
eObj($$$$$$)
eObj($$$$$$$)
{
my ($ret,$map,$name,$val,$in,$prefix) = @_;
my ($ret,$map,$name,$val,$in,$prefix,$firstLevel) = @_;
my $err;
if($val =~ m/^"/) {
@ -5177,9 +5177,18 @@ json2nameValue($;$$)
} elsif($val =~ m/^{/) { # }
($err, $val, $in) = lObj($val, '{', '}');
return ($err,undef) if($err);
my $r2 = json2nameValue($val);
foreach my $k (keys %{$r2}) {
setVal($ret, $map, $prefix, "${name}_$k", $r2->{$k});
my %r2;
my $in2 = $val;
while($in2 =~ m/^\s*"([^"]+)"\s*:\s*(.*)$/s) {
my ($name,$val) = ($1,$2);
$name =~ s/[^a-z0-9._\-\/]/_/gsi;
($err,$in2) = eObj(\%r2, $map, $name, $val, $in2, $prefix);
return ($err,undef) if($err);
$in2 =~ s/^\s*,\s*//;
}
foreach my $k (keys %r2) {
setVal($ret, $map, $prefix, $firstLevel ? $k : "${name}_$k", $r2{$k});
}
} elsif($val =~ m/^\[/) {
@ -5188,7 +5197,8 @@ json2nameValue($;$$)
my $idx = 1;
$val =~ s/^\s*//;
while($val) {
($err,$val) = eObj($ret, $map, $name."_$idx", $val, $val, $prefix);
($err,$val) = eObj($ret, $map, $firstLevel ? $idx : $name."_$idx",
$val, $val, $prefix);
return ($err,undef) if($err);
$val =~ s/^\s*,\s*//;
$val =~ s/\s*$//;
@ -5214,20 +5224,16 @@ json2nameValue($;$$)
return (undef, $in);
}
$in = $1 if($in =~ m/^\s*{(.*)}\s*$/s);
$in =~ s/^\s+//;
$in =~ s/\s+$//;
my $err;
while($in =~ m/^\s*"([^"]+)"\s*:\s*(.*)$/s) {
my ($name,$val) = ($1,$2);
$name =~ s/[^a-z0-9._\-\/]/_/gsi;
($err,$in) = eObj(\%ret, $map, $name, $val, $in, $prefix);
if($err) {
Log 4, $err;
%ret = ();
return \%ret;
}
$in =~ s/^\s*,\s*//;
($err,$in) = eObj(\%ret, $map, "", $in, "", $prefix, 1);
if($err) {
Log 4, $err;
%ret = ();
return \%ret;
}
return \%ret;
}