【问题标题】:JSON array with VB.Net带有 VB.Net 的 JSON 数组
【发布时间】:2018-12-07 03:32:29
【问题描述】:

我想用 VB.NET 创建这个 JSON 内容,并且可以正确实现 WriteStartArray()。内容需要成为 REST API 调用的负载。

创建令牌结构对我来说有点挑战性。我已经习惯了 XML,并且必须适应我正在调用的 API 的新表示。

如果能将 Newtonsoft 代码直观地映射到一个简单而高级的 JSON 文档,那就太好了。我的情况是我正在构建一个集成原型。试图使最终解决方案尽可能简单,以便其他爱好者可以轻松地在 VB.NET 中使用 JSON。

在使用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    

有什么建议吗? 谢谢,O.

【问题讨论】:

  • 感谢布赖恩提供的信息。我不想最终得到很多模型。每个 API 调用都有自己的结构,其中一些可能是动态的。你会碰巧有一些示例代码吗?

标签: json xml vb.net rest json.net


【解决方案1】:

根据您的操作,您可能会发现为 JSON 创建模型类并将其序列化比使用 JsonWriter 手动编码 JSON 更容易。

您可以通过将所需 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

请注意,Rootobject 类中的 cilist 属性最初是这样错误生成的:

    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

【讨论】:

    【解决方案2】:

    您的错误是在创建第一个数组后,您必须启动另一个对象(如{ 字符所示)。所以,如果你像这样编辑你的代码:

    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"
          }
        }
      ]
    }
    

    【讨论】:

    • 非常感谢。我创建了一个 .NET 小提琴。请参阅代码:dotnetfiddle.net/0roThW
    • 所以,我猜这个代码 sn-p 解决了你的问题。如果对您有帮助,您可能希望接受答案。
    猜你喜欢
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2018-07-26
    • 1970-01-01
    相关资源
    最近更新 更多