・ハッシュをエンコードすると「"":null」というエントリが混ざる
文字列の余分なエリアの切り捨て漏れです。nako_hash_keysの返却値を受け取るようにしてSetLengthすると良さそうです。
----------- unit_kabin.pas(78付近)
SetLength(s, 1024 * 16);
i :=nako_hash_keys(p, PAnsiChar(s), 1024 * 16);
SetLength(s,i);
-----------
・\uXXXXで正しく変換されない文字がある
json.pasがXXXXの16進表記で英大文字を受け付けないためです。&
#039;A&
#039;..&
#039;F&
#039;も十六進表記文字の一覧に加えると良さそうです。
-----------json.pas(454付近)
json_hex_chars = &
#039;0123456789abcdef&
#039;;
json_hex_chars_set = [&
#039;0&
#039;..&
#039;9&
#039;,&
#039;a&
#039;..&
#039;f&
#039;,&
#039;A&
#039;..&
#039;F&
#039;];
-----------
・jsonのデータにnullがあるとデコードで全体が空になる
objがnullの場合のデータを生成していないため。nullに対してはobjがnullというデータとして取得され、json_type_nullは無効なjsonデータのときに使われるようです。
-----------unit_kabin.pas(111付近)
if obj = nil then
begin
Result := hi_var_new;
Exit;
end;
-----------
他、jsonのハッシュのキーが非ASCIIの場合、デコードの際にutf8toAnsiを介さず返されるためにキーだけUTF8のままになっています。JSONの仕様上発生しえるのなら、あわせて対処が必要そうです。