- my $replace = $row;
- $row = {map { $_ =>
- ref $wordcol{$_} eq 'HASH' && $wordcol{$_}->{-multiple} ?
- [ map { parseinput($_) } $post{'@'.$_}->@* ] :
- scalar parseinput($post{$_})
- } keys %wordcol};
+ my $replace = $row; # currently stored
+ $row = {}; # proposed update
+ while (my ($col, $colinfo) = each %wordcol) {
+ ref $colinfo eq 'HASH' or $colinfo = {};
+ my @val = map { parseinput($_) } $post{'@'.$col}->@*;
+ my $val = $colinfo->{-multiple} && @val ? \@val : $val[-1];
+ if (my $jsoncol = $colinfo->{-json}) {
+ defined $val and
+ $row->{$jsoncol}->{$col} = $val; # hash will be encoded
+ }
+ else {
+ $row->{$col} = $val;
+ }
+ }
+ my $imagecol = $row->{image}; # backup image subcolumns
+ ref $_ eq 'HASH' and $_ = encode_json($_) for values %{$row};