json2dict turns an array into a nested list when one item starts with $. $ should not have special meaning in JSON, so I am not sure what happens here. Steps to reproduce:

30 % set var [json::write string \$::x ]
"$::x"
31 % set json [json::write array $var]
["length","$::x"]
32 % set dict [json::json2dict $json]
length {$::x}