获取 vb.net 中 JSON 对象的值

Getting Values of a JSON Object in vb.net

已编辑:

我在获取 vb.net 中的 JSON 对象的值时卡住了。我的 JSON 请求发布如下所示的数据:

function submitEmail() {

        var ClientsPersonalInfo = {
            FullName: $("#FullName").val(),
            PhoneNumber: $("#PhoneNumber").val(),
            EmailAddress: $("#EmailAddress").val(),
            DOB: $("#DOB").val(),
            Occupation: $("#Occupation").val(),
            NINumber: $("#NINumber").val(),
            FullAddress: $("#FullAddress").val()
        }

        var ClientsData = {};
        ClientsData.ClientsPersonalInfo = ClientsPersonalInfo;

        var d = '{"ClientsData":' + JSON.stringify(ClientsData) + '}'

        $.ajax({
            type: "POST",
            url: "add-new-client.aspx/SubmitEmail",
            data: d,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (response) {
                alert(response)
            },
            failure: function (msg) {
                alert(msg);
            }
        });
}

JSON 对象看起来像

{
"ClientsPersonalInfo": {
    "FullName": "",
    "PhoneNumber": "",
    "EmailAddress": "",
    "DOB": "",
    "Occupation": "",
    "NINumber": "",
    "FullAddress": ""
    }
}

上面请求returns一个对象在vb.net

VB代码:

<WebMethod()> _
    Public Shared Function SubmitEmail(ByVal ClientsPersonalInfo As Object) As String

        // What to do next to get object "ClientsPersonalInfo"
        // I want to access properties of the object like
        //Dim name As String = ClientsPersonalInfo.FullName

        Return "Successfully Converted."

    End Function

不,我想获取此对象的值,需要附加一个 table。请指导我如何获取上述对象的值?

  1. 首先使用 jsonlint

  2. 确保您的 Json 格式有效
  3. 然后使用jsonutils

    生成class
    Public Class ClientsPersonalInfo
       Public Property FullName As String
       Public Property PhoneNumber As String
       Public Property EmailAddress As String
       Public Property DOB As String
       Public Property Occupation As String
       Public Property NINumber As String
       Public Property FullAddress As String
    End Class
    
    Public Class ClientsVehicleInfo
       Public Property DrivingLicense As String
       Public Property VehicleMakeModel As String
       Public Property VehicleColour As String
       Public Property PolicyNumber As String
       Public Property TypeOfCover As String
       Public Property VehicleStoredIn As String
    End Class
    
    Public Class ClientsData
       Public Property ClientsPersonalInfo As ClientsPersonalInfo
       Public Property ClientsVehicleInfo As ClientsVehicleInfo
    End Class
    
    Public Class ClientData
       Public Property ClientsData As ClientsData
    End Class
    
  4. 使用 Newtonsoft JSON 将您的 Json 反序列化为对象,然后您可以简单地访问其属性值。 (记得使用管理 NuGet 包将 Json.net 添加到您的项目)

    Imports Newtonsoft.Json
    
    Dim obj = JsonConvert.DeserializeObject(Of Dictionary(Of String, ClientsData))(yourJsonString)
    

至少有一个问题是没有使用 Option Strict On。错误代码:

Shared Function SubmitEmail(ByVal ClientData As Object) As String
    Dim obj = JsonConvert.DeserializeObject(Of NewClientData)(ClientData)

如果您打开 Option Strict 将无法编译,因为 JsonConvert.DeserializeObject 采用字符串参数。我不确定为什么异常(图像现已删除)似乎来自 VB 而不是 Newtonsoft,但这无济于事。

你的反序列化对象也会在方法结束时超出范围时消失。


适用于编辑 #9

提到字典的错误似乎具有误导性,并且可能与属性的收集方式有关(很多时候 json 可以反序列化为字典(Of String,String)。鉴于 json 发布(含数据):

{
"ClientsData": {
    "ClientsPersonalInfo": {
        "FullName": "Ziggy Le Strange",
        "PhoneNumber": "505050",
        "EmailAddress": "ziggy@foobar.com",
        "DOB": "",
        "Occupation": "Freelancer",
        "NINumber": "7",
        "FullAddress": "123 Easy street"
    }
  }
}

实际上有 3 个 classes:ClientsPersonalInfo 和数据,ClientsData 是一个包含那个数据的 class,在之前的编辑中还包括一个 ClientsVehicleInfo class.

但是还有另一个 class 由封闭的 {...} 表示。可以为您创建classes 的机器人将其命名为ExampleRootObject。在这种情况下,我将其称为 ClientContainer

这个有效:

' the outermost {}
Public Class ClientContainer
    Public Property ClientsData As ClientsData
End Class

Public Class ClientsPersonalInfo
    Public Property FullName As String
    Public Property PhoneNumber As String
    Public Property EmailAddress As String
    Public Property DOB As String
    Public Property Occupation As String
    Public Property NINumber As String
    Public Property FullAddress As String
End Class

Public Class ClientsData
    Public Property ClientsPersonalInfo As ClientsPersonalInfo 
    Public Property ClientsVehicleInfo As ClientsVehicleInfo
End Class

Public Class ClientsVehicleInfo
    ' whatever it is supposed to hold
End Class

要反序列化数据(您可能需要对其进行调整以供网络使用,Shared 对我来说似乎不正确):

' pass in the json AS STRING
' returns JUST the ClientsPersonalInfo
Public Function GetClientData(jsonData As String) As ClientsPersonalInfo

   ' you must use the container class 
    Dim client = JsonConvert.DeserializeObject(Of ClientContainer)(jsonData )

    ' TEST:
    Console.WriteLine(client.ClientsData.ClientsPersonalInfo.FullName)

    Return client.ClientsData.ClientsPersonalInfo

End Function

ClientsData 似乎是一个不需要的层。容器可以直接容纳其他两个物体。 如果这意味着要为多个客户保存信息,您可以用密钥代替 json 中的 "ClientsData":(例如 "ziggy":{}, "zacky":{}, "zoey":{}

输出:

Ziggy Le Strange

因为根据评论,车辆信息是交易的一部分,您可以将其更改为 return ClientsData,其中包含个人和车辆信息:

Public Function GetClientData(jsonData As String) As ClientsData

   ' you must use the container class 
    Dim client = JsonConvert.DeserializeObject(Of ClientContainer)(jsonData )

    Return client.ClientsData
  1. 开启Option Strict
  2. 不要框参数或 returns As Object,它们失去了一些意义。
  3. 请记住,json 中最外层的大括号表示容器对象

此外,将日期存储为字符串看起来也很糟糕。