2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-23 02:31:53 +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}; my $cidArr = $modules{MQTT2_DEVICE}{defptr}{cid}{$newCid};
return if(!$cidArr); return if(!$cidArr);
my $add; my $add;
if(length($value) < 10000 && $value =~ m/^\s*{.*}\s*$/s) { if(length($value) < 10000 && $value =~ m/^\s*[{[].*[}\]]\s*$/s) {
my $ret = json2nameValue($value); my $ret = json2nameValue($value);
if(keys %{$ret}) { if(keys %{$ret}) {
$topic =~ m,.*/([^/]+),; $topic =~ m,.*/([^/]+),;

View File

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