【问题标题】:Deserializing JSON into a List (or other object type)将 JSON 反序列化为 List(或其他对象类型)
【发布时间】:2019-07-03 16:22:15
【问题描述】:

我在将一些 JSON 反序列化为我可以使用的对象类型时遇到问题。

我一直在尝试多种不同的方法来反序列化某些东西,但我无法让其中任何一种工作。目前,我正在尝试使用 Newtonsoft.Json 解串器。

Public Class ServerRecord
    Inherits Record
    <Newtonsoft.Json.JsonProperty("sys_class_name")>
    Public Property sys_class_name As String
        Get
        End Get
        Set(value As String)
        End Set
    End Property

    <Newtonsoft.Json.JsonProperty("host_name")>
    Public Property host_name As String
        Get
        End Get
        Set(value As String)
        End Set
    End Property
    <Newtonsoft.Json.JsonProperty("u_recovery_time_achievable")>
    Public Property u_recovery_time_achievable As String
        Get
        End Get
        Set(value As String)
        End Set
    End Property
End Class


Dim lstSNServersList As New List(Of ServerRecord)
Dim objServiceNowTableAPIClient As TableAPI.TableAPIClient(Of ServerRecord)
Dim objServiceNowRESTQueryResponse As RESTQueryResponse(Of ServerRecord)

    objServiceNowTableAPIClient = New TableAPIClient(Of wServerRecord)(strServiceNowCMDBServersTableName, strServiceNowInstanceName, strServiceNowUser, strServiceNowPassword)
    strServiceNowQuery = "sys_class_name=cmdb_ci_win_server^ORsys_class_name=cmdb_ci_linux_server"
    objServiceNowRESTQueryResponse = objServiceNowTableAPIClient.GetByQuery(strServiceNowQuery)
    'this much does work and it does return a result set

    'this is my attempt to convert this response into a list of ServerRecords, but this does not work currently:
    lstSNServersList = JsonConvert.DeserializeObject(Of List(Of ServerRecord))(objServiceNowRESTQueryResponse.RawJSON) 

objServiceNowRestQueryResponse.RawJSON 字符串看起来像这样(虽然更长):

{
   "result":[
      {
         "sys_id":"00040665dbxxxxxx96191e",
         "u_recovery_time_achievable":"720",
         "sys_class_name":"cmdb_ci_linux_server",
         "host_name":"rlserver001"
      },
      {
         "sys_id":"00ec543d1xxxx66e4bcb6d",
         "u_recovery_time_achievable":"4",
         "sys_class_name":"cmdb_ci_linux_server",
         "host_name":"plserver001"
      },
      {
         "sys_id":"0105d975dbxxxxx8961998",
         "u_recovery_time_achievable":"",
         "sys_class_name":"cmdb_ci_linux_server",
         "host_name":"tlserver001"
      }
   ]
}

这是我在尝试运行代码时收到的错误消息:

抛出异常:'Newtonsoft.Json.JsonSerializationException' in Newtonsoft.Json.dll

附加信息:无法反序列化当前 JSON 对象 (例如 {"name":"value"}) 转换为类型 'System.Collections.Generic.List`1[CMDBReconciliation.CMDBReconciliation+ServiceNowServerRecord]' 因为该类型需要一个 JSON 数组(例如 [1,2,3])来反序列化 正确。

要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3]) 或更改反序列化类型,使其成为普通的 .NET 类型(例如,不是像整数这样的原始类型,不是集合类型 像数组或列表)可以从 JSON 对象反序列化。 JsonObjectAttribute 也可以添加到类型中以强制它 从 JSON 对象反序列化。

路径“结果”,第 1 行,位置 10。

【问题讨论】:

  • 我认为 json 本身不是一个列表,因为其中还有“结果”元素。因此,我认为您需要一个“结果”类,其属性是 ServerRecord 的列表。这有意义吗?
  • 您可以反序列化为具有List(Of ServerRecord) 属性类型的RootObject 类、Dim jsonObject = JObject.Parse("[Your JSON]")) Dim myDTResults = JsonConvert.DeserializeObject(Of DataTable)(jsonObject("result").ToString()) 中的DataTable 以及许多其他方式。
  • 使用自动属性,如&lt;JsonProperty("sys_class_name")&gt; Public Property SysClassName As String
  • 太完美了!谢谢吉米(还有亚历克斯)!下面的作品,我现在可以遍历所有条目! Dim jsonObject = JObject.Parse(objServiceNowRESTQueryResponse.RawJSON) Dim myDTResults = JsonConvert.DeserializeObject(Of DataTable)(jsonObject("result").ToString()) 对于每一行作为 DataRow 在 myDTResults.Rows ServerName = row("host_name")下一个

标签: json vb.net serialization deserialization


【解决方案1】:

这会奏效。它只是从 json 字符串中提取数组部分。

Dim start As Integer = objServiceNowRESTQueryResponse.IndexOf("[")
Dim last As Integer = objServiceNowRESTQueryResponse.LastIndexOf("]")
lstSNServersList = JsonConvert.DeserializeObject(Of List(Of ServerRecord))(objServiceNowRESTQueryResponse.Substring(start, last - start + 1))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-08
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    相关资源
    最近更新 更多