💡

Jil.JSON.Serialize で、object型やdynamic型のプロパティまでJSONにする

2023/04/20に公開

出来そうなもんだけど、すぐにできなくて悩んだので、解決方法だけメモ。
なんで出来るようになるかは、わかっていないので、教えてエロい人

検証したコード

static async Task MainAsync(string[] args)
{
    // ASP.NETとかで、Vueとかに読ませるようの ViewModel を作るときに、こんなことしたい。
    // ほんとは、EntityFrameworkとかからSelectして匿名型で拾って、var vm = new {,,,};みたいなのを、
    // @Raw(Jil.JSON.Serialize(vm))する。Jil使うのは単純に早いから。
    // こういうのは中身が全然違う事が多い気がする
    var json = new string[]
        {
            "{\"prpty1\":\"value1a\", \"prpty2\":\"value2a\", \"prpty3\":\"value3a\"}",
            "{\"prpty1\":\"value1b\", \"prpty2\":\"value2b\", \"prpty3\":\"value3b\"}",
            "{\"prpty1\":\"value1c\", \"prpty2\":\"value2c\", \"prpty3\":\"value3c\", \"prpty4\":\"value4c\"}",
            "{\"prpty1\":\"value1d\", \"prpty4\":\"value2d\", \"prpty5\":[{\"id\":1},{\"id\":2},{\"id\":3}]}",
        };

    var deserializedObjects = json.Select(x => Jil.JSON.Deserialize<dynamic>(x));

    var 中身が空っぽになる = Jil.JSON.Serialize(deserializedObjects);
    var 期待した結果になる = Jil.JSON.Serialize<object>(deserializedObjects);

    Console.WriteLine("中身が空っぽになる : {0}", 中身が空っぽになる);
    Console.WriteLine("期待した結果になる : {0}", 期待した結果になる);
}

結果

中身が空っぽになる : [{},{},{},{}]
期待した結果になる : [{"prpty1":"value1a","prpty2":"value2a","prpty3":"value3a"},{"prpty1":"value1b","prpty2":"value2b","prpty3":"value3b"},{"prpty1":"value1c","prpty2":"value2c","prpty3":"value3c","prpty4":"value4c"},{"prpty1":"value1d","prpty4":"value2d","prpty5":[{"id":1},{"id":2},{"id":3}]}]

Jil.JSON.Serializeするときに、明示的に object 型を指定してあげると、匿名型のプロパティまでちゃんとSerializeされました。

ちなみにdynamic↓にしてもちゃんとできました。

var deserializedObjects = json.Select(x => Jil.JSON.Deserialize<object>(x));var deserializedObjects = json.Select(x => Jil.JSON.Deserialize<dynamic>(x));

理屈はわからん。
後でSharpLabとかでIL見てみようかな

Discussion