さけのさかなのブログ

同人ゲーム開発やってます。Unity使ったりする。

【Unity】古いMiniJsonは使うな

 以下のコードでバグがでる。

System.Globalization.CultureInfo.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo("fr-FR");
var dict = new Dictionary<string, object>();
dict["hoge"] = 1.5f;
var jsonString = MiniJSON.Json.Serialize(dict); // {"hoge":1,5} 不正なJson文字列が吐き出されて
MiniJSON.Json.Deserialize(jsonString); // 解釈に失敗。エラー!

 CurrentCultureなんていじらねーよ!と思うかもしれませんが、OSがフランス語設定だと同じ現象が起こります。

原因

 小数点表記がカルチャ依存になっていることに由来する。

 フランス語圏においては小数点はカンマでなので、MiniJsonはそれにひっぱられて↑のコードだと{"hoge":1,5}というJsonを吐き出す。

 一方でJsonの規格は小数点をドットで統一しているので、このJson文字列は不正なものとなる。なんとMiniJson自身でも解釈に失敗する。

対応

 おとなしくモダンなJsonリアライザつかいましょう。

 どうしてもというなら、修正版があってこっちでは直ってるっぽい。 github.com

 (CurrentCultureをインバリアントカルチャにいちいち設定してやる、というのは思いつくんですが、スレッドごとの指定だとか、影響範囲がわからん、とかでリスキーかと)

docs.microsoft.com

ついでに

float.Parsefloat.ToStringもウカツに使うとアカンという話でもあり。

こわいね

 国内リリースでは機嫌よく動いてたゲームが海外に出すと動かん、みたいなのはこういうところが原因だったり。

続き

toriden.hatenablog.com