VB.NET动态反序列化Newtonsoft JSON为对象



给出的ANSWER描述了如何使用LINQ to JSON和JObject动态地将JSON转换为可操作的对象。下面是完整的代码,它将我的JSON转换为一个可操作的对象,后面跟着原始问题。

            'Parse string of JSON data into a JObject that can be accessed via VB.NET
            Dim resultSet As JObject = JObject.Parse(responseBody)
            'Data can be accessed as seen below
            Dim cpu As String = CType(resultSet("KeyName"), String)

=========================================================================

我有一个web应用程序,将使几个API调用一个名为inContact (http://www.incontact.com/)的服务

每个API调用都将收到一个HTTP响应,其中包含JSON格式,如下所示:

    {
  "resultSet": {
    "_links": {
      "self": "string",
      "next": "string",
      "previous": "string"
    },
    "businessUnitId": 0,
    "lastPollTime": "2016-11-08T21:45:46.510Z",
    "totalRecords": 0,
    "agents": [
      {
        "agentId": 0,
        "userName": "string",
        "firstName": "string",
        "middleName": "string",
        "lastName": "string",
        "emailAddress": "string",
        "isActive": true,
        "teamId": 0,
        "teamName": "string",
        "reportToId": 0,
        "reportToName": "string",
        "isSupervisor": true,
        "lastLogin": "2016-11-08T21:45:46.510Z",
        "lastUpdated": "2016-11-08T21:45:46.510Z",
        "location": "string",
        "custom1": "string",
        "custom2": "string",
        "custom3": "string",
        "custom4": "string",
        "custom5": "string",
        "internalId": "string",
        "profileId": 0,
        "profileName": "string",
        "timeZone": "string",
        "country": "string",
        "countryName": "string",
        "state": "string",
        "city": "string",
        "chatRefusalTimeout": 0,
        "phoneRefusalTimeout": 0,
        "workItemRefusalTimeout": 0,
        "defaultDialingPattern": 0,
        "defaultDialingPatternName": "string",
        "teamDefaultMaxChats": true,
        "maxConcurrentChats": 0,
        "notes": "string",
        "createDate": "2016-11-08T21:45:46.510Z",
        "inactiveDate": "2016-11-08T21:45:46.510Z",
        "hireDate": "2016-11-08T21:45:46.510Z",
        "terminationDate": "2016-11-08T21:45:46.510Z",
        "rehireStatus": true,
        "employmentType": 0,
        "employmentTypeName": "Full-Time",
        "referral": "string",
        "atHome": true,
        "hiringSource": "string",
        "ntLoginName": "string",
        "scheduleNotification": "5",
        "federatedId": "string",
        "sipUser": "string",
        "useTeamMaxEmailInboxCount": true,
        "maxEmailInboxCount": 0
      }
    ]
  }
}

我用Newtonsoft对JSON进行反序列化。然而,对于每个不同的调用,将会有不同的键/值对,例如:

{
  "resultSet": {
    "businessUnitId": 0,
    "lastPollTime": "2016-11-08T21:45:46.604Z",
    "teams": [
      {
        "teamId": 0,
        "teamName": "string",
        "isActive": true,
        "description": "string",
        "notes": "string",
        "lastUpdateTime": "2016-11-08T21:45:46.604Z",
        "inViewEnabled": true,
        "wfoEnabled": true,
        "wfmEnabled": true,
        "qmEnabled": true,
        "maxConcurrentChats": 0,
        "agentCount": 0,
        "maxEmailInboxCount": true,
        "inViewGamificationEnabled": true,
        "inViewChatEnabled": true,
        "inViewLMSEnabled": true,
        "analyticsEnabled": true
      }
    ],
    "agents": [
      {
        "agentId": 0,
        "firstName": "string",
        "lastName": "string"
      }
    ]
  }
}

我目前正在接受HTTP响应并对JSON进行反序列化以创建一个可行的。net对象。下面是我的简化代码,省略了HTTP请求,假设请求成功:

        If Not String.IsNullOrEmpty(responseBody) Then
            ' Success. Do something with the response.
            'Declare object for holding the JSON from the API call for this call only (class does not fit other calls)
            Dim resultSet As GetAgentsAPICall = New GetAgentsAPICall
            'Deserialize JSON response into the new resultSet object
            resultSet = JsonConvert.DeserializeObject(responseBody)

问题是,我需要一个特定的类为每个API调用,而不是只是能够采取JSON格式的字符串,并把它扔到一个对象与属性匹配的键/值。下面是我的类,它只接受上面的API调用(列出的第一个,长度较长):

Public Class GetAgentsAPICall
    Public Property resultSet As Resultset
End Class
Public Class Resultset
        Public Property _links As _Links
        Public Property businessUnitId As Integer
        Public Property lastPollTime As Date
        Public Property totalRecords As Integer
        Public Property agents() As Agent
    End Class
    Public Class _Links
        Public Property self As String
        Public Property _next As String
        Public Property previous As String
    End Class
    Public Class Agent
        Public Property agentId As Integer
        Public Property userName As String
        Public Property firstName As String
        Public Property middleName As String
        Public Property lastName As String
        Public Property emailAddress As String
        Public Property isActive As Boolean
        Public Property teamId As Integer
        Public Property teamName As String
        Public Property reportToId As Integer
        Public Property reportToName As String
        Public Property isSupervisor As Boolean
        Public Property lastLogin As Date
        Public Property lastUpdated As Date
        Public Property location As String
        Public Property custom1 As String
        Public Property custom2 As String
        Public Property custom3 As String
        Public Property custom4 As String
        Public Property custom5 As String
        Public Property internalId As String
        Public Property profileId As Integer
        Public Property profileName As String
        Public Property timeZone As String
        Public Property country As String
        Public Property countryName As String
        Public Property state As String
        Public Property city As String
        Public Property chatRefusalTimeout As Integer
        Public Property phoneRefusalTimeout As Integer
        Public Property workItemRefusalTimeout As Integer
        Public Property defaultDialingPattern As Integer
        Public Property defaultDialingPatternName As String
        Public Property teamDefaultMaxChats As Boolean
        Public Property maxConcurrentChats As Integer
        Public Property notes As String
        Public Property createDate As Date
        Public Property inactiveDate As Date
        Public Property hireDate As Date
        Public Property terminationDate As Date
        Public Property rehireStatus As Boolean
        Public Property employmentType As Integer
        Public Property employmentTypeName As String
        Public Property referral As String
        Public Property atHome As Boolean
        Public Property hiringSource As String
        Public Property ntLoginName As String
        Public Property scheduleNotification As String
        Public Property federatedId As String
        Public Property sipUser As String
        Public Property useTeamMaxEmailInboxCount As Boolean
        Public Property maxEmailInboxCount As Integer
End Class

我试图避免预先构建20或30个类似的冗长类,而是动态构建一个可修改的列表或对象。我将需要获取值并将它们存储在数据库中或修改它们并使用另一个API调用来POST值。有人有最佳实践吗,还是我被20-30个巨大的类定义困住了?

谢谢你的时间!

JObject解析它,它也可以使用LINQ查询(参见Newtonsoft的LINQ到JSON API,位于Newtonsoft.Json.Linq命名空间下):

JObject o = JObject.Parse(@"{
    'CPU': 'Intel',
    'Drives': [
        'DVD read/writer',
         '500 gigabyte hard drive'
     ]
}");
string cpu = (string)o["CPU"];
// Intel
string firstDrive = (string)o["Drives"][0];
// DVD read/writer
IList<string> allDrives = o["Drives"].Select(t => (string)t).ToList();
// DVD read/writer
// 500 gigabyte hard drive

的例子是在c#,但你可以找到相关的VB。. NET在StackOverflow上的答案(例如,在这里查看答案)。

相关内容

  • 没有找到相关文章

最新更新