JSON字符串和DatacontractJsonDeserializer

时间:2012-11-17 00:31:03

标签: json datacontractserializer datacontractjsonserializer

我正在尝试解析从服务中返回的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

2 个答案:

答案 0 :(得分:1)

通过查看此电话:

Console.WriteLine(menu.value)

我怀疑Menu类未正确定义...您的Menu类是否有一个名为'menu'的属性,并且此'menu'属性的类型是一个复杂类型,其属性名为'id', '价值','弹出'?

答案 1 :(得分: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?我现在无法测试它,但请给你一个建议。