json - VB.NET动态地将Newtonsoft JSON反序列化为对象

标签 json vb.net serialization json.net deserialization

给出的答案描述了使用 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 应用程序,它将对名为 inContact ( http://www.incontact.com/ ) 的服务进行多次 API 调用

每个 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 调用将值发回。有没有人有最佳实践,或者我是否坚持 20-30 个巨大的类定义?

感谢您的宝贵时间!

最佳答案

使用 JObject 解析它,也可以使用 LINQ 进行查询(请参阅 Newtonsoft 的 LINQ to 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# 编写的,但您可以在 StackOverflow 上找到相关的 VB.NET 答案(例如,查看 the answer here )。

关于json - VB.NET动态地将Newtonsoft JSON反序列化为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40497402/

相关文章:

javascript - 无法从 Ajax 请求中读取 Javascript 对象

json - 在 Protractor 测试中访问来自实际 API 服务的数据

c# - 为什么将整数分配给双重附加属性会出错?

vb.net - 从datetimepicker获取时间到mysql时间数据类型

java - Java 方法中序列化/反序列化子类对象

java - Gson 自定义 byte[] 处理程序

javascript - JSON 和二进制数

java - 序列化嵌套的 JSON 数组

vb.net - 目前不会命中 VS 2008 断点。没有为此文档加载任何符号

php - 不允许序列化 'Symfony\Component\HttpFoundation\File\File',Symfony4