none
VB.NETでDynamicJSONを使ってJSONの値を参照できますか? RRS feed

  • 質問

  • VB.NETでDynamicJSONを使いましたが、値が true のみで、JSONの値が参照できませんでした。
    利用方法をご存知の方や、利用されている方がいらっしゃいましたら、ご教示頂けないでしょうか。

    環境
     VisualStudio2015 Pro
     .NET  Framework 4.0
     DynamicJson ver 1.2.0.0 (May. 21th, 2010)

    ソース

    ' Json形式を読み込む
    Dim jsnValue = Codeplex.Data.DynamicJson.Parse("{""title"":""json"", ""cost"":100, ""value"":{ ""boolval"":true } }")
    Dim result1 = jsnValue.title                   ' titleを取得
    Dim result2 = jsnValue.cost                    ' costを取得
    ' Dim result3 = jsnValue.value.boolval           ' value.boolvalを取得
    ' Dim result4 = jsnValue("value")("boolval")     ' 文字列で検索取得
    
    MsgBox("Result1:" + result1.ToString + vbCrLf +
           "Result2:" + result2.ToString, vbInformation)

    実行結果

    ※ソースは以下のホームページを参考にしています。
    http://vbdotnetc.blogspot.jp/2016/04/cvbnetjson.html



    2017年7月25日 8:35

回答

  • DynamicJsonの仕様ですね。

    まず、DynamicJsonは、.title とプロパティでアクセスした場合はそのメンバの値を返し、.title() とメソッドとしてアクセスした場合はそのメンバが存在しているかどうかをBooleanで返す、という仕様になっています。

    C#だと .title と .title() でメソッドとプロパティを呼び分けられますが、VBだと()の有無は全く関係ないので(プロパティ呼び出しでも .prop() と書けるしメソッド呼び出しでも .method と書ける)、とりあえずメソッドの呼び出しとして解決しようとします(で、メソッドの呼び出し解決に失敗すれば続けてプロパティの呼び出しとして解決する)。その結果、常に .title() 側が実行され、メンバが存在しているかどうかのBoolean値が返されてしまいます。

    C#だと他に ["title"] というインデクサアクセスでもできるのですが、VBではこれも不可能(.titleと同じ扱いになる)みたいですね。

    直接TryGetMemberを呼び出すという手もありますが色々面倒。

    他のJsonライブラリ、例えばJson.NETとかの使用を検討した方がいいかもしれません。あるいはこれを機にC#に乗り換えるか。

    2017年7月25日 13:02

すべての返信

  • C# でですが、参考にされている記事の通りにパースして、期待した結果を表示できますが・・・

    何が違うんでしょうね?

    var jsnValue = DynamicJson.Parse(@"{""title"":""json"", ""cost"":100, ""value"":{ ""boolval"":true } }");
    var result1 = jsnValue.title;
    var result2 = jsnValue.cost;
    var result3 = jsnValue.value.boolval;
    var result4 = jsnValue["value"]["boolval"];
    
    Console.WriteLine("Result1: {0}, Result2: {1}, Result3: {2}, Result4: {3}", 
                    result1, result2, result3, result4);
    
    // 結果は:
    // Result1: json, Result2: 100, Result3: True, Result4: True

    自分の環境は Win 10 Pro 64-bit, Visual Studio 2010 Pro, .NET 4, x86, DynamicJson ver 1.2.0.0, C#, コンソールアプリです。


    2017年7月25日 10:04
  • DynamicJsonの仕様ですね。

    まず、DynamicJsonは、.title とプロパティでアクセスした場合はそのメンバの値を返し、.title() とメソッドとしてアクセスした場合はそのメンバが存在しているかどうかをBooleanで返す、という仕様になっています。

    C#だと .title と .title() でメソッドとプロパティを呼び分けられますが、VBだと()の有無は全く関係ないので(プロパティ呼び出しでも .prop() と書けるしメソッド呼び出しでも .method と書ける)、とりあえずメソッドの呼び出しとして解決しようとします(で、メソッドの呼び出し解決に失敗すれば続けてプロパティの呼び出しとして解決する)。その結果、常に .title() 側が実行され、メンバが存在しているかどうかのBoolean値が返されてしまいます。

    C#だと他に ["title"] というインデクサアクセスでもできるのですが、VBではこれも不可能(.titleと同じ扱いになる)みたいですね。

    直接TryGetMemberを呼び出すという手もありますが色々面倒。

    他のJsonライブラリ、例えばJson.NETとかの使用を検討した方がいいかもしれません。あるいはこれを機にC#に乗り換えるか。

    2017年7月25日 13:02
  • DynamicsJson 自体は C# でソースコードが公開されているので、TryInvokeMember を TryGet 相当に改造すれば、VB.NET でも使えそうですね。
    別のライブラリに行くか、その1クラスの改造だけ C# で頑張るか。

    result = IsDefined(binder.Name);
    → result = ToValue(xml.Element(binder.Name));

    // 元の VB.NET 参考サイトはコンパイルが通ったところまでしか見てなかったのだろうか...?

    2017年7月25日 13:44
    モデレータ
  • // 元の VB.NET 参考サイトはコンパイルが通ったところまでしか見てなかったのだろうか...?
    内容は関係なくてアフィリエイトリンクが目的では…?
    2017年7月25日 22:23
  • 一応説明しておくとDynamicJson

    dynamic json structure for C# 4.0.

    と説明されているようにC# 4.0(以降)での使用が前提です。他の言語での使用は自己責任でしょう。NuGetでも配布されていますがDynamincJson.csソースコードのみです。

    2017年7月25日 22:35
  • 皆さま、ご指摘ありがとうございます。
    DynamicJSON は C# 4.0用のライブラリで VB.NET は非対応(保証なし)だったのですね。

    VisualStudioからは、以下のように ビューで各プロパティ が確認出来ていたので、VB.NET からもプロパティを参照できると期待していましたが、Method,Property の制限には気付きませんでした。
    ソースコードがあり、方針も助言頂いていますので、VB.NET用に改編も考えていますが、今のところ力不足なので当面は .NET Framework提供の DataContractJsonSerializer 適用を検討してみます。
    【VB.NETに対応する Json.NET がありました。先にこちらの適用を検討してみます】
    http://json.codeplex.com/

    今後は進展についてUpいたします。

    VisualStudioからプロパティ確認
     


    2017年7月26日 4:45
  • DataContractJsonSerializer も Json.NET もデシリアライズするクラスの定義が必要ですが、JSON 文字列から C# のクラス定義を生成してくれるサイトがあるので紹介しておきます。

    json2csharp - generate c# classes from json
    http://json2csharp.com/

    C# のコードを VB.NET に変換してくれるサイトもあります。

    Telerik Code Converter
    http://converter.telerik.com/

    2017年7月26日 6:45