[C#, Json] Json とクラスのメンバー名が異なる場合

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


返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA