トップ回答者
VB.NETでDynamicJSONを使ってJSONの値を参照できますか?

質問
-
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
- 編集済み k.Marukawa 2017年7月26日 5:22
回答
-
DynamicJsonの仕様ですね。
まず、DynamicJsonは、.title とプロパティでアクセスした場合はそのメンバの値を返し、.title() とメソッドとしてアクセスした場合はそのメンバが存在しているかどうかをBooleanで返す、という仕様になっています。
C#だと .title と .title() でメソッドとプロパティを呼び分けられますが、VBだと()の有無は全く関係ないので(プロパティ呼び出しでも .prop() と書けるしメソッド呼び出しでも .method と書ける)、とりあえずメソッドの呼び出しとして解決しようとします(で、メソッドの呼び出し解決に失敗すれば続けてプロパティの呼び出しとして解決する)。その結果、常に .title() 側が実行され、メンバが存在しているかどうかのBoolean値が返されてしまいます。
C#だと他に ["title"] というインデクサアクセスでもできるのですが、VBではこれも不可能(.titleと同じ扱いになる)みたいですね。
直接TryGetMemberを呼び出すという手もありますが色々面倒。
他のJsonライブラリ、例えばJson.NETとかの使用を検討した方がいいかもしれません。あるいはこれを機にC#に乗り換えるか。
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年7月26日 0:24
- 回答としてマーク k.Marukawa 2017年7月27日 9:25
すべての返信
-
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#, コンソールアプリです。
- 編集済み SurferOnWww 2017年7月25日 10:05
-
DynamicJsonの仕様ですね。
まず、DynamicJsonは、.title とプロパティでアクセスした場合はそのメンバの値を返し、.title() とメソッドとしてアクセスした場合はそのメンバが存在しているかどうかをBooleanで返す、という仕様になっています。
C#だと .title と .title() でメソッドとプロパティを呼び分けられますが、VBだと()の有無は全く関係ないので(プロパティ呼び出しでも .prop() と書けるしメソッド呼び出しでも .method と書ける)、とりあえずメソッドの呼び出しとして解決しようとします(で、メソッドの呼び出し解決に失敗すれば続けてプロパティの呼び出しとして解決する)。その結果、常に .title() 側が実行され、メンバが存在しているかどうかのBoolean値が返されてしまいます。
C#だと他に ["title"] というインデクサアクセスでもできるのですが、VBではこれも不可能(.titleと同じ扱いになる)みたいですね。
直接TryGetMemberを呼び出すという手もありますが色々面倒。
他のJsonライブラリ、例えばJson.NETとかの使用を検討した方がいいかもしれません。あるいはこれを機にC#に乗り換えるか。
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年7月26日 0:24
- 回答としてマーク k.Marukawa 2017年7月27日 9:25
-
一応説明しておくとDynamicJsonは
dynamic json structure for C# 4.0.
と説明されているようにC# 4.0(以降)での使用が前提です。他の言語での使用は自己責任でしょう。NuGetでも配布されていますがDynamincJson.csソースコードのみです。
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年7月26日 0:24
-
皆さま、ご指摘ありがとうございます。
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からプロパティ確認
- 編集済み k.Marukawa 2017年7月26日 5:28
-
DataContractJsonSerializer も Json.NET もデシリアライズするクラスの定義が必要ですが、JSON 文字列から C# のクラス定義を生成してくれるサイトがあるので紹介しておきます。
json2csharp - generate c# classes from json
http://json2csharp.com/C# のコードを VB.NET に変換してくれるサイトもあります。
Telerik Code Converter
http://converter.telerik.com/- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年8月1日 6:01