JSON массив с VB.Net - PullRequest
       1

JSON массив с VB.Net

0 голосов
/ 07 декабря 2018

Я хотел бы создать этот контент JSON с помощью VB.NET, и я могу правильно реализовать WriteStartArray ().Контент должен стать полезной нагрузкой для вызова API REST.

Структура токена мне немного сложна для создания.Я привык к XML и должен приспособиться к новому представлению API, которые я вызываю.

Было бы здорово иметь визуальное отображение кода Newtonsoft в простой и сложный документ JSON.В моем случае я создаю прототип для интеграции.Попытка сделать окончательные решения как можно более простыми, чтобы другие энтузиасты могли легко войти с JSON в VB.NET.

При использовании https://dotnetfiddle.net/ я учусь быстрее на рабочем примере.

Пример данных:

{
      "cilist": [
            {
                  "id": "bppmwsserver_6",
                  "className": "BMC_ComputerSystem",
                  "attributeMap": {
                        "HomeCell": "pncell_bppmwsserver",
                        "PNReadAcl": "[]",
                        "WriteSecurity": "[Full Access]",
                        "PNWriteAcl": "[]",
                        "DATABASE_event_max_sev": "OK",
                        "PriorityWatchdog": "NO",
                        "UsingOrganization": "",
                        "OwnerContact": "",
                        "Domain": "calbro.com",
                        "status": "OK",
                        "maintenance_mode": "NO",
                        "schedule_status": "IN",
                        "HostName": "bppmwsserver",
                        "manual_status": "NONE",
                        "root_causes": "[]",
                        "computed_priority": "PRIORITY_5",
                        "DeviceID": "1",
                        "impacting_open_event_max_sev": "OK",
                        "InstanceId": "",
                        "USER_TRANSACTIONS_event_max_sev": "OK",
                        "ImpactCostPerSecOut": "0.000000e+000",
                        "APPLICATION_event_max_sev": "OK",
                        "SYSTEM_event_max_sev": "OK",
                        "Company": "",
                        "OwnerName": "",
                        "Description": "Test CI",
                        "sub_status": "NONE",
                        "UsingOrganizationId": "-1",
                        "any_event_max_sev": "OK",
                        "Priority": "PRIORITY_5",
                        "Name": "bppmwsserver.calbro.com",
                        "publish_env_id": "",
                        "mc_udid": "bppmwsserver_6",
                        "ReadSecurity": "[Full Access]",
                        "PrimaryCapability": "Server"
                  }
            }
      ]
}

Пример кода:

Public Shared Function DefineJsonServerCI() As String
    Dim JsonCI As New JTokenWriter()
    Try

        JsonCI.WriteStartObject()
        JsonCI.WritePropertyName("cilist")
        JsonCI.WriteStartArray()
        JsonCI.WritePropertyName("id")
        JsonCI.WriteValue("CI ID")
        JsonCI.WritePropertyName("className")
        JsonCI.WriteValue("BMC_ComputerSystem")
        JsonCI.WriteEndArray()
        JsonCI.WriteEndObject()



    Catch ex As Exception
        Console.WriteLine(" Exception:{0};Create JSON CI;{1}", ex.Message, ex.Source)
    End Try
    Return JsonCI
End Function    

Есть предложения?Thx, O.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

В зависимости от того, что вы делаете, вам может быть проще создавать классы моделей для вашего JSON и сериализовать их, чем вручную кодировать JSON с помощью JsonWriter.

Вы можете создавать классы моделей, копируяобразец желаемого JSON в буфер обмена (чем больше заполнено, тем лучше), а затем в Visual Studio с помощью функции Edit -> Paste Special -> Paste JSON as Classes.Имейте в виду, что эта функция не генерирует свойства массива правильно, поэтому вам нужно будет их вручную исправить.Вы можете изменить имена классов так, как вам хочется.Имена свойств должны совпадать с тем, что вы хотите в выводе JSON, если вы не украсили их атрибутом <JsonProperty>, указывающим альтернативное имя для использования в JSON.

С вашим примером JSON я сгенерировал следующие классы моделей:

Public Class Rootobject
    Public Property cilist As List(Of Cilist)
End Class

Public Class Cilist
    Public Property id As String
    Public Property className As String
    Public Property attributeMap As Attributemap
End Class

Public Class Attributemap
    Public Property HomeCell As String
    Public Property PNReadAcl As String
    Public Property WriteSecurity As String
    Public Property PNWriteAcl As String
    Public Property DATABASE_event_max_sev As String
    Public Property PriorityWatchdog As String
    Public Property UsingOrganization As String
    Public Property OwnerContact As String
    Public Property Domain As String
    Public Property status As String
    Public Property maintenance_mode As String
    Public Property schedule_status As String
    Public Property HostName As String
    Public Property manual_status As String
    Public Property root_causes As String
    Public Property computed_priority As String
    Public Property DeviceID As String
    Public Property impacting_open_event_max_sev As String
    Public Property InstanceId As String
    Public Property USER_TRANSACTIONS_event_max_sev As String
    Public Property ImpactCostPerSecOut As String
    Public Property APPLICATION_event_max_sev As String
    Public Property SYSTEM_event_max_sev As String
    Public Property Company As String
    Public Property OwnerName As String
    Public Property Description As String
    Public Property sub_status As String
    Public Property UsingOrganizationId As String
    Public Property any_event_max_sev As String
    Public Property Priority As String
    Public Property Name As String
    Public Property publish_env_id As String
    Public Property mc_udid As String
    Public Property ReadSecurity As String
    Public Property PrimaryCapability As String
End Class

Обратите внимание, что свойство cilist в классе Rootobject изначально было сгенерировано неправильно, как показано ниже:

    Public Property cilist() As Cilist

И я вручную исправил его следующим образом:

    Public Property cilist As List(Of Cilist)

Чтобы создать JSON оттуда, достаточно просто заполнить модели и сериализовать их:

Dim obj As New Rootobject With
{
    .cilist = New List(Of Cilist) From
    {
        New Cilist With
        {
            .id = "bppmwsserver_6",
            .className = "BMC_ComputerSystem",
            .attributeMap = New Attributemap With
            {
                .HomeCell = "pncell_bppmwsserver",
                .PNReadAcl = "[]",
                .WriteSecurity = "[Full Access]",
                .PNWriteAcl = "[]",
                .DATABASE_event_max_sev = "OK",
                .PriorityWatchdog = "NO",
                .UsingOrganization = "",
                .OwnerContact = "",
                .Domain = "calbro.com",
                .status = "OK",
                .maintenance_mode = "NO",
                .schedule_status = "IN",
                .HostName = "bppmwsserver",
                .manual_status = "NONE",
                .root_causes = "[]",
                .computed_priority = "PRIORITY_5",
                .DeviceID = "1",
                .impacting_open_event_max_sev = "OK",
                .InstanceId = "",
                .USER_TRANSACTIONS_event_max_sev = "OK",
                .ImpactCostPerSecOut = "0.000000e+000",
                .APPLICATION_event_max_sev = "OK",
                .SYSTEM_event_max_sev = "OK",
                .Company = "",
                .OwnerName = "",
                .Description = "Test CI",
                .sub_status = "NONE",
                .UsingOrganizationId = "-1",
                .any_event_max_sev = "OK",
                .Priority = "PRIORITY_5",
                .Name = "bppmwsserver.calbro.com",
                .publish_env_id = "",
                .mc_udid = "bppmwsserver_6",
                .ReadSecurity = "[Full Access]",
                .PrimaryCapability = "Server"
            }
        }
    }
}

Dim json As String = JsonConvert.SerializeObject(obj, Formatting.Indented)

Вот рабочий пример: https://dotnetfiddle.net/9xA8Hf

0 голосов
/ 07 декабря 2018

Ваша ошибка в том, что после создания первого массива вы должны запустить другой объект (как указано символом {).Итак, если вы отредактируете свой код следующим образом:

Public Function DefineJsonServerCI() As String
    Dim JsonCI As New JTokenWriter()
    Try
        JsonCI.WriteStartObject()
        JsonCI.WritePropertyName("cilist")
        JsonCI.WriteStartArray()
        JsonCI.WriteStartObject()
        JsonCI.WritePropertyName("id")
        JsonCI.WriteValue("bppmwsserver_6")
        JsonCI.WritePropertyName("className")
        JsonCI.WriteValue("BMC_ComputerSystem")
        JsonCI.WritePropertyName("attributeMap")
        JsonCI.WriteStartObject()
        JsonCI.WritePropertyName("HomeCell")
        JsonCI.WriteValue("pncell_bppmwsserver")
        JsonCI.WriteEndObject()
        JsonCI.WriteEndObject()
        JsonCI.WriteEndArray()
        JsonCI.WriteEndObject()

    Catch ex As Exception
        Console.WriteLine(" Exception:{0};Create JSON CI;{1}", ex.Message, ex.Source)
    End Try
    Return JsonCI.Token.ToString 
End Function

Вы получите следующий объект JSON.Вам просто нужно добавить остальные свойства вашего объекта attributeMap.

{
  "cilist": [
    {
      "id": "bppmwsserver_6",
      "className": "BMC_ComputerSystem",
      "attributeMap": {
        "HomeCell": "pncell_bppmwsserver"
      }
    }
  ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...