C# 抽象クラスのオブジェクトをJson形式の文字列に変換するときの注意点
System.Text.Json
を使って、抽象クラスのオブジェクトをJson形式の文字列に変換する時の注意点を紹介します。
Json形式の文字列に変換する基本的な方法はC# System.Text.JsonでclassをJson形式の文字列に変換するで紹介しています。
例えば以下のクラスがあるとします。Chat
は抽象クラスで、GroupChat
はChat
クラスを継承した具象クラスです。
// 抽象クラス
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
のインスタンスを作成し、ChatToJson
でJson
形式の文字列に変換しようとしてもうまくいきません。
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"}
具象クラスのプロパティも変換されることが確認できます。