例えば、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 については以下で紹介しました。



