反序列化嵌套的JSON和VB.Net

时间:2018-12-18 10:56:09

标签: json vb.net

我尝试从以下json结果的基本部分中获取值

   {
  "responseCode": "Ok",
  "responseMessage": "",
  "ssnStatus": "Active",
  "basic": {
    "firstName": "Testnamn",
    "givenName": "Gettnamn",
    "surName": "Testname",
    "middleName": null,
    "lastName": "Lastname",
    "co": null,
    "street": "Teststreet lgh 1202",
    "zipCode": "92609",
    "city": "Stad"
  },
  "phoneNumbers": {
    "phoneNumbers": []
  },
  "ssnStatusBlock": null
}

我可以使用下面的代码获取第一级(ssnStatus),但是如何获取firstName,givenName等?

Dim post As Post = JsonConvert.DeserializeObject(Of Post)(exampleJson)
                    Dim ssnStatus As String = post.ssnStatus

Public Class Post
        Public Property ssnStatus As String
End Class

1 个答案:

答案 0 :(得分:0)

您缺少JSON对象的所有其他成员的属性和类定义。

  • 在您的项目中创建一个新的类文件。给它起一个正确描述JSON用法的名称
  • 添加 Imports Newtonsoft.Json 导入
  • 复制描述JSON结构的JSON对象的示例(这里有一个很好的对象),
  • 将插入号放置在新的类定义中
  • 请参阅Visual Studio菜单: Edit -> Paste Special -> Paste JSON as classes

Visual Studio将创建处理您选择的JSON对象所需的所有类和属性。

注意:对于更复杂的类,可能会发生Visual Studio生成的结果与您要求的不完全相同的情况。在这种情况下,请尝试提供免费转换服务的专业网站之一:

新的根类定义将命名为Rootobject。根据需要更改此名称,
为了更清楚地说明该类的用途。

这是Visual Studio使用问题中的JSON对象创建的类定义。
我创建了一个名为MyWebSitePost的类Project类,并按照前面的描述创建了JSON bject类定义,然后重命名了默认的主类Post,替换了默认的Rootobject名称:

Public Class MyWebSitePost

    Public Class Post
        Public Property responseCode As String
        Public Property responseMessage As String
        Public Property ssnStatus As String
        Public Property basic As Basic
        Public Property phoneNumbers As Phonenumbers
        Public Property ssnStatusBlock As Object
    End Class

    Public Class Basic
        Public Property firstName As String
        Public Property givenName As String
        Public Property surName As String
        Public Property middleName As Object
        Public Property lastName As String
        Public Property co As Object
        Public Property street As String
        Public Property zipCode As String
        Public Property city As String
    End Class

    Public Class Phonenumbers
        Public Property phoneNumbers() As Object
    End Class
End Class

然后,您可以使用已经拥有的代码来访问所有其他属性:

  

(某些属性类型可能已设置为Object;修改为   需要)。

Dim JsonPost As Post = JsonConvert.DeserializeObject(Of Post)(exampleJson)
Dim ssnStatus As String = JsonPost.ssnStatus
Dim FirstName As String = JsonPost.basic.firstName

以此类推。

注意
如您所见,所有属性都有默认名称,如JSON对象中所定义。一些属性名称并不是真正适合描述其内容。例如,co属性可能是Country名称。要更改属性名称,可以使用<JsonProperty>属性,该属性引用JSON对象的原始名称,并为属性使用自定义名称:

'(...)
<JsonProperty("co")>
Public Property Country As Object
'(...)

然后您可以使用自定义名称访问此属性:

Dim CountryName As String = JsonPost.basic.Country