| 著作一覧 |
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は誰も使ってないんだなぁ。
ジェズイットを見習え |