zukucode
主にWEB関連の情報を技術メモとして発信しています。

C# 抽象クラスのオブジェクトをJson形式の文字列に変換するときの注意点

System.Text.Jsonを使って、抽象クラスのオブジェクトをJson形式の文字列に変換する時の注意点を紹介します。

Json形式の文字列に変換する基本的な方法はC# System.Text.JsonでclassをJson形式の文字列に変換するで紹介しています。

例えば以下のクラスがあるとします。Chatは抽象クラスで、GroupChatChatクラスを継承した具象クラスです。

// 抽象クラス
public abstract class Chat
{
    public Chat(int chatId, string chatName)
    {
        ChatId = chatId;
        ChatName = chatName;
    }

    public int ChatId { get; set; }
    public string ChatName { get; set; }
}

// Chatクラスを継承した具象クラス
public class GroupChat : Chat
{
    public GroupChat(int chatId, string chatName, string groupName) : base(chatId, chatName)
    {
        GroupName = groupName;
    }

    public string GroupName { get; set; }
}

実際にはChatを継承した具象クラスはたくさんあり、以下のようにJson形式に変換する共通ファンクションを作成したとします。

using System.Text.Json;

public static class Helper
{
    public static void ChatToJson(Chat chat)
    {
        string test = JsonSerializer.Serialize(chat);
        Console.WriteLine(test);
    }
}

以下のように、GroupChatのインスタンスを作成し、ChatToJsonJson形式の文字列に変換しようとしてもうまくいきません。

var groupChat = new GroupChat(1, "チャット名", "グループ名");
Helper.ChatToJson(groupChat);
// 出力結果
// {"ChatId":1,"ChatName":"\u30C1\u30E3\u30C3\u30C8\u540D"}

抽象クラスのChatのプロパティしか変換されず、GroupNameの情報が落ちてしまっています。

JsonSerializer.Serializeの処理で、実際の具象クラスの型を指定する必要があるので、JsonSerializer.Serialize(クラスオブジェクト, クラスオブジェクトの型)の形式で修正します。

public static void ChatToJson(Chat chat)
{
    string test = JsonSerializer.Serialize(chat);
    string test = JsonSerializer.Serialize(chat, chat.GetType());
    Console.WriteLine(test);
}

// 出力結果
// {"GroupName":"\u30B0\u30EB\u30FC\u30D7\u540D","ChatId":1,"ChatName":"\u30C1\u30E3\u30C3\u30C8\u540D"}

具象クラスのプロパティも変換されることが確認できます。


関連記事