例えば、C# でこんなクラスがあるとします。
public class JsonClass { public string MimeType; }
C# の名称はパスカルケースにする事が多いですよね。
jsonclass という名前があった場合、jsonClass をキャメルケース、JsonClass をパスカルケース、json_class をスネークケースと言います。
ところが、API 側から出力される Json テキストはフィールド名がスネークケースでした。
{ "mime_type": "application/octet-stream", }
このまま Json テキストをパースしたところで、クラスに値は入りません。
さて……。
クラスのメンバー名は会社の命名規約で変えられない。
Json テキストを返してくれる API は他社製なので変えられない。
どちらの無理も通したい
こんな状況、結構あるんじゃないでしょうか。
大丈夫。クラスの書きかたを工夫すれば、相互やりとりが可能になります。
public class JsonClass { [SerializeField] private string mime_type; public string MimeType { get => mime_type; set => mime_type = value; } }
SerializeField で指定したフィールドを Json に合わせ、プログラムで使用するメンバーはそれを参照する形です。
もしメンバーが ReadOnly で構わないのであれば、ラムダを使ってもっと単純に記述する事もできます。
public class JsonClass { [SerializeField] private string mime_type; public string MimeType => mime_type; }
規約の是非については色々あると思いますが、開発人員の規模が大きくなるほど大事になってきますよね。
Unity のサンプルコード
using System.IO; using UnityEngine; public class JsonClass { [SerializeField] private string mime_type; public string MimeType => mime_type; [SerializeField] private string size; public string Size => size; [SerializeField] private string id; public string Id => id; [SerializeField] private string name; public string Name => name; [SerializeField] private string created_time; public string CreatedTime => created_time; } public class JsonTest : MonoBehaviour { // Start is called before the first frame update void Start() { string text = File.ReadAllText("testjson.txt"); var json = JsonUtility.FromJson<JsonClass>(text); } }
JsonUtility を Json.Net など他のライブラリにすれば Unity 以外でも動作すると思います。
Json.Net については以下で紹介しました。