【问题标题】:Getting Values of a JSON Object in vb.net在 vb.net 中获取 JSON 对象的值
【发布时间】:2015-11-22 08:41:10
【问题描述】:

已编辑:

我在 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": ""
    }
}

上述请求在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

不,我想获取这个对象的值并且需要附加到一个表中。请指导我如何获取上述对象的值?

【问题讨论】:

  • 问题已编辑并添加详细信息。
  • 我对编辑有点困惑。你想要一个客户字典(显示的 json 更多的是 1 项)还是客户属性字典(而不是客户端类,每个属性都是一个键)
  • @Plutonix 我已经编辑了我最初做的问题。我不知道如何在 vb.net 中获取对象的值
  • 车辆信息是否包含在交易中?当我输入答案时,它来了又去。像这样的激进编辑不受欢迎,因为它使已经发布的答案看起来不正确

标签: json vb.net webmethod


【解决方案1】:

至少有一个问题是没有使用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

提及 Dictionary 的错误似乎具有误导性,并且可能与如何收集属性有关的内部问题(很多时候 json 可以反序列化为 Dictionary(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 个类:ClientsPersonalInfo 带有数据,ClientsData 是一个包含该数据的类,在以前的编辑中还包括一个 ClientsVehicleInfo 类。

但是还有另一个类由封闭的{...} 表示。可以为您创建类的机器人将其命名为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

由于根据评论,车辆信息是交易的一部分,您可以将其更改为返回 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. 不要框参数或返回As Object,它们失去了一些意义。
  3. 请记住,json 中最外面的大括号代表一个容器对象

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

【讨论】:

  • 我的原始帖子中有一些错误,因为我无法跟上您的编辑。您的 ClientData 类不正确Public Property ClientsPersonalInfo As ClientsPersonalInfo
  • 摆脱上述错误,但现在出现此错误:imageshack.com/a/img911/4020/G8MpZy.jpg
  • 它可能需要&lt;WebMethod()&gt; 属性(至少)。我对网络编码一无所知,这就是为什么在你问之前我没有阅读/回答这篇文章。该代码有效 - 您可以将其粘贴到 WinForms 应用程序中并使用 Dim jsonData = File.ReadAllText(THe_JSON_FILENAME) 加载示例 json 以对其进行测试。 如何实施它超出了我的专业范围
  • 好的,没问题。顺便谢谢你的帮助伙伴。
  • 您可以尝试更改名称并添加Shared。这似乎是设置中唯一真正的区别(GetClientData 可能与与 Web 客户端相关的内容发生冲突 - 我不知道)。
【解决方案2】:
  1. 首先使用jsonlint确保您的Json格式有效

  2. 然后使用jsonutils生成基于它的类

    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
    
  3. 使用Newtonsoft JSON 将您的 Json 反序列化为对象,然后您可以简单地访问其属性值。 (记得使用 Manage NuGet Packages 将 Json.net 添加到您的项目中)

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

【讨论】:

  • 我做到了第二步,但我不知道如何使用生成的类
  • 我添加了有问题的 json 对象
  • 执行此操作后出现此错误:从类型“字典(字符串,对象)”到类型“字符串”的转换无效。
  • 我添加了有问题的 json 对象
  • 我已经编辑了问题并添加了 vb 和 javascript 代码
猜你喜欢
  • 2018-11-15
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 2013-08-28
相关资源
最近更新 更多