1

サービスから返されたJson文字列を解析しようとしています。簡単にするために、次のようになります。

Dim jsonstring = _
<s>
{"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
  {"value": "New", "onclick": "CreateNewDoc()"},
  {"value": "Open", "onclick": "OpenDoc()"},
  {"value": "Close", "onclick": "CloseDoc()"}
]
}
}}
</s>.Value

現在、次の関数を使用してjson文字列をオブジェクトに読み取っていますが、すべてのプロパティは常に何もありません。上記の文字列の json オブジェクトごとにオブジェクトを作成しました。オブジェクトには Datacontract 属性と Datamember 属性があります。ヒントはありますか?

Dim menu = JsonObject(Of Menu)(jsonstring)
    Console.WriteLine(menu.value)

Private Function JsonObject(Of t)(jsonString As String) As t
    Dim ser As New DataContractJsonSerializer(GetType(t))
    Dim ms As New MemoryStream(Encoding.UTF8.GetBytes(jsonString))
    ms.Position = 0
    Dim obj As t = DirectCast(ser.ReadObject(ms), t)
    Return obj
End Function
4

2 に答える 2

1

この呼び出しを見ると:

Console.WriteLine(menu.value)

Menu クラスが正しく定義されていないのではないかと疑っています...あなたの Menu クラスには「メニュー」というプロパティがあり、この「メニュー」プロパティの型は「id」、「値」と呼ばれるプロパティを持つ複合型ですか? 、 '現れる'?

于 2012-11-19T21:14:19.173 に答える
0

返信いただきありがとうございます。

Json2cshap.com を使用して、この Json String をクラスに変換しました。クラス(c#)版はこんな感じ。唯一の違いは、私のものは VB.net であり、すべてのクラス/プロパティに属性があることです。

public class Menuitem
{
    public string value { get; set; }
    public string onclick { get; set; }
}

public class Popup
{
    public List<Menuitem> menuitem { get; set; }
}

public class Menu
{
    public string id { get; set; }
    public string value { get; set; }
    public Popup popup { get; set; }
}

public class RootObject
{
    public Menu menu { get; set; }
}

ルート オブジェクト (RootObject) を Menu と呼ぶべきですか? 今はテストできませんが、あなたの提案を試してみてください。

于 2012-11-20T01:34:18.187 に答える