💡
Jil.JSON.Serialize で、object型やdynamic型のプロパティまでJSONにする
出来そうなもんだけど、すぐにできなくて悩んだので、解決方法だけメモ。
なんで出来るようになるかは、わかっていないので、教えてエロい人
検証したコード
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