【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自身でも解釈に失敗する。
対応
どうしてもというなら、修正版があってこっちでは直ってるっぽい。 github.com
(CurrentCultureをインバリアントカルチャにいちいち設定してやる、というのは思いつくんですが、スレッドごとの指定だとか、影響範囲がわからん、とかでリスキーかと)
ついでに
float.Parse
やfloat.ToString
もウカツに使うとアカンという話でもあり。
こわいね
国内リリースでは機嫌よく動いてたゲームが海外に出すと動かん、みたいなのはこういうところが原因だったり。