【问题标题】:Deserializing JSON with square brackets VB.NET使用方括号 VB.NET 反序列化 JSON
【发布时间】:2021-01-09 00:34:52
【问题描述】:

所以我有以下 json 字符串:

{
    "domain": "something.com",
    "subject": {
        "id": "1111",
        "name": "My name",
        "date": "2016-07-06"
    },
    "atributes": [
        {
            "height": "178",
            "age": "45"
        }
    ]
}

这样做我可以毫无问题地解析第一个“圆括号”:

    Dim json = Await client.GetStringAsync(url) //gettin the json from an API
    Dim jss = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Object)(json) 

    For Each Jproperty In jss("subject")

        Dim name1 = Jproperty.Name.ToString
        Dim value1 = Jproperty.Value.ToString

        TextBox1.Text &= name1 & ": " & value 1
        //Which returns: 
        //id: 111
        //name: My name
        //date: 2016-07-06

    Next

酷,到目前为止一切都很好,但我不能在我的生活中对“属性”做同样的事情,也许是因为它在一些 方括号 内,这使它成为我相信的数组?当我尝试在另一个中为每个人做同样的事情时,我得到一个异常,说在“JObject”对象中找不到“名称”。使用Dim height = Jproperty.Name.ToString

但是当我使用类似的东西调用“属性”时

Dim height = Jproperty.ToString (without "Name") 它可以工作,但返回一个巨大的字符串,这不是我真正需要的。

谢谢,我希望我说得通!

【问题讨论】:

    标签: json vb.net


    【解决方案1】:

    如果您期望从 API 调用中获得的 JSON 始终具有相同的结构,我建议您创建一个类并反序列化为该类,而不是 Object。 (方括号中的内容将由您的类中的集合类型表示。)

    例如

    Class JsonClass
        <JsonProperty("domain")>
        Property [Domain] As String
        <JsonProperty("subject")>
        Property [Subject] As cSubject
        <JsonProperty("atributes")>
        Property [Attibutes] As List(Of cAttribute)
    
        Class cSubject
            <JsonProperty("id")>
            Property [Id] As String
            <JsonProperty("name")>
            Property [Name] As String
            <JsonProperty("date")>
            Property [Date] As String
        End Class
    
        Class cAttribute
            <JsonProperty("height")>
            Property [Height] As String
            <JsonProperty("age")>
            Property [Age] As String
        End Class
    End Class
    
    Dim jss As JsonClass = Newtonsoft.Json.JsonConvert.DeserializeObject(Of JsonClass)(json) 
    

    使用这种方法无需循环遍历原始 JSON。

    【讨论】:

      【解决方案2】:

      你是对的,“方括号”代表一个对象数组。
      注意对象数组,这意味着您需要另一个“第三个”foreach 来遍历对象的属性。

      Dim json = Await client.GetStringAsync(url)
      Dim jss = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Object)(json) 
      
      For Each property In jss("subject")
          Dim name1 = property.Name.ToString()
          Dim value1 = property.Value.ToString()
      
          ' ...
      Next
      
      For Each attribute In jss("attributes")
          For Each property In attribute
              Dim name1 = property.Name.ToString()
              Dim value1 = property.Value.ToString()
      
              ' ...
          Next
      Next
      

      【讨论】:

      • 非常感谢,正是我需要的
      猜你喜欢
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多