Десериализация JSON в список (или другой тип объекта) - PullRequest
0 голосов
/ 03 июля 2019

У меня возникли проблемы с десериализацией некоторых 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' в 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.

1 Ответ

0 голосов
/ 03 июля 2019

Это будет работать. Он просто извлекает часть массива из строки 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))
...