著作一覧 |
JSONを受け付けるシステムをVBで記述している。
受け付けるJSONはいろいろなので、いちいちJsonSerializerでかっちりクラスを定義するつもりはない。
かといって、今更Dictionary<string, object>もないだろうということでdynamicだ。
というわけで、評判も良いしコンパクトだしDynamicJsonを使うことにした。
が、だめだ。VB Runtimeの問題だとは思うが、TryInvokeMemberは呼び出すが、TryGetを呼び出さない(C#からは呼べるのでTryInvokeMemberのバグということはないよな?)
'実証コード Imports System Imports Codeplex.Data Module Module1 Sub Main() Dim o As Object o = DynamicJson.Parse("{""strprop"":""abc"", ""numprop"": 123}") Console.WriteLine("strprop:" & o.strprop) '=> True Console.WriteLine("numprop:" & o.numprop) '=> True End Sub End Module
オープンソースはすばらしい。
というわけで、おれさまJsonParserに改造した。
ExpandoObjectに全部読み込んでしまうから、VBでも問題なし。
Sub Main() Dim o As Object o = DynamicJson.Parse("{""strprop"":""abc"", ""numprop"": 123}") Console.WriteLine("strprop:" & o.strprop) '=> True Console.WriteLine("numprop:" & o.numprop) '=> True o = JsonParser.Parse("{""strprop"":""abc"", ""numprop"": 123}") Console.WriteLine("strprop:" & o.strprop) '=> abc Console.WriteLine("numprop:" & o.numprop) '=> 123 End Sub
追記:いや、DynamicJsonのTryInvokeMemberの実装バグだ……。C#と違ってVBは()を省略できるから、プロパティゲッタではなくメソッド呼び出しと解釈して、かつ結果がTrueになるからoutパラメータに設定したTrueを結果としているわけじゃん。今更Issuesに送るのもなんだな(6年前のプロジェクトだし)というか、本当にVBは誰も使ってないんだなぁ。
ジェズイットを見習え |