diff --git a/fhem/FHEM/10_MQTT2_DEVICE.pm b/fhem/FHEM/10_MQTT2_DEVICE.pm index f1c490326..4d6ffdf49 100644 --- a/fhem/FHEM/10_MQTT2_DEVICE.pm +++ b/fhem/FHEM/10_MQTT2_DEVICE.pm @@ -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,.*/([^/]+),; diff --git a/fhem/fhem.pl b/fhem/fhem.pl index f0390b5ed..0019ef92d 100755 --- a/fhem/fhem.pl +++ b/fhem/fhem.pl @@ -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; }