Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.net VB序列化JSON属性名称问题_Json_Vb.net - Fatal编程技术网

VB.net VB序列化JSON属性名称问题

VB.net VB序列化JSON属性名称问题,json,vb.net,Json,Vb.net,我对JSON属性名有问题。可能是因为我不知道自己在做什么。这是我第一次尝试序列化JSON(使用vb.net vb) 我想要的结果是: { "login": { "username": "XXX", "password": "pwxXXxx", "busId": "123456789", "busRole": "Third Party", "paymentTerms": "Prepaid" } } 这就是我得到的: [ {

我对JSON属性名有问题。可能是因为我不知道自己在做什么。这是我第一次尝试序列化JSON(使用vb.net vb)

我想要的结果是:

{
  "login": {
    "username": "XXX",
    "password": "pwxXXxx",
    "busId": "123456789",
    "busRole": "Third Party",
    "paymentTerms": "Prepaid"
  }
}
这就是我得到的:

[
    {
        "login": null,
        "username": "1234",
        "password": "pw123456",
        "busId": "12345",
        "busRole": "Third Party",
        "paymentTerms": "Prepaid"
    }
]
我的问题是“login”:{“添加了冒号和null。我将在下面发布我的代码 任何帮助都将不胜感激

-多谢各位

Partial Class _Default
        Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        Dim loads As New List(Of fgtload)()

        loads.Add(New fgtload() With {
        .username = "1234",
        .password = "pw123456",
        .busId = "12345",
        .busRole = "Third Party",
        .paymentTerms = "Prepaid"
         }
        )
        Dim strserialize As String = JsonConvert.SerializeObject(loads)
        lblserial.Text = strserialize
End Sub


Public Class fgtload

    <JsonProperty(PropertyName:="login")>
    Public Property login As String

    Public Property username() As String
        Get
            Return m_username
        End Get
        Set
            m_username = Value
        End Set
    End Property
    Private m_username As String

    Public Property password() As String
        Get
            Return m_password
        End Get
        Set
            m_password = Value
        End Set
    End Property
    Private m_password As String

    Public Property busId() As String
        Get
            Return m_busId
        End Get
        Set
            m_busId = Value
        End Set
    End Property
    Private m_busId As String

    Public Property busRole() As String
        Get
            Return m_busRole
        End Get
        Set
            m_busRole = Value
        End Set
    End Property
    Private m_busRole As String


    Public Property paymentTerms() As String
        Get
            Return m_paymentTerms
        End Get
        Set
            m_paymentTerms = Value
        End Set
    End Property
    Private m_paymentTerms As String
End Class
如何向包装器添加另一个类

Public Class fgtDetails  ' 
    Public ServiceClass As String
    Public typeQuery As String
    Public pickupDate As Integer
    Public productCode As String
End Class

从我所看到的情况来看,您试图将login元素声明为空字符串,因此序列化为null。根据您所说的尝试实现,您希望将login声明为包含用户名、密码、BusID、BusRole和PaymentTerms属性的对象

从您要查找的内容来看,Login属性是一个对象,但您将其声明为字符串。此外,您正在创建一个列表并对其进行序列化,这将导致JSON周围的方括号([,])。方括号标记数组或枚举,而在示例JSON中,您只查找一个对象

最后一个技巧是,对于用于序列化的类,您不必使用属性。您可以将变量声明为公共变量。您需要使用属性的唯一时间是在设置或读取时是否需要修改或处理其内容。例如,在设置字符串时格式化字符串,或计算响应在检索变量时使用nse(您可以将代码放入GET和SET方法中,使它们像函数一样工作)

序列化和反序列化需要注意的是,您可以嵌套类。序列化后,它们将使用相同的对象布局和变量名转换为JSON对象。因此,您可以尝试以下操作:

(更新代码)

这就产生了这种反应。 (最新产出)

希望这有帮助

(更新说明):

为了响应您的评论,我修改了响应中的代码,以允许或更新您的预期输出

还要注意,如果两个JSON对象具有相同的结构(在本例中为originLocation和destinationLocation),则可以使用相同的类


此外,请参见商品数据中的方括号,这表示一个JSON数组。代码中的数组/列表/枚举将序列化为JSON数组,即使它们是类类型。因此,在本代码示例中,您可以根据需要向ListOfCommodities.Commodity添加任意数量的商品,并将它们正确序列化为JSON。

从我所看到的情况来看,您试图将login元素声明为空字符串,因此序列化为null。根据您所说的尝试实现,您希望将login声明为包含用户名、密码、BusID、BusRole和PaymentTerms属性的对象

从您要查找的内容来看,Login属性是一个对象,但您将其声明为字符串。此外,您正在创建一个列表并对其进行序列化,这将导致JSON周围的方括号([,])。方括号标记数组或枚举,而在示例JSON中,您只查找一个对象

最后一个技巧是,对于用于序列化的类,您不必使用属性。您可以将变量声明为公共变量。您需要使用属性的唯一时间是在设置或读取时是否需要修改或处理其内容。例如,在设置字符串时格式化字符串,或计算响应在检索变量时使用nse(您可以将代码放入GET和SET方法中,使它们像函数一样工作)

序列化和反序列化需要注意的是,您可以嵌套类。序列化后,它们将使用相同的对象布局和变量名转换为JSON对象。因此,您可以尝试以下操作:

(更新代码)

这就产生了这种反应。 (最新产出)

希望这有帮助

(更新说明):

为了响应您的评论,我修改了响应中的代码,以允许或更新您的预期输出

还要注意,如果两个JSON对象具有相同的结构(在本例中为originLocation和destinationLocation),则可以使用相同的类


此外,请参见商品数据中的方括号,这表示一个JSON数组。代码中的数组/列表/枚举将序列化为JSON数组,即使它们是类类型。因此,在本代码示例中,您可以根据需要向ListOfCommodities.Commodity添加任意数量的商品,并将它们正确序列化为JSON。

Y这非常有帮助。非常感谢您花时间回答并详细解释。为了简洁起见,我在示例中添加了一个短端JSON输出。我总共可以构造5个类。我尝试向包装器添加一个细节类,但失败了。我认为没有足够的字符来放置整个exp此处为ected输出。公共类详细信息的公共服务类为字符串公共类型查询为字符串公共pickupDate为整数公共产品代码为字符串结束类Daniel,再次感谢您。从您添加的最后4个类中,我发现我走错了方向。我试图将它们添加到fgtload中课堂。如前所述,我对所有这些都有点陌生。我非常感谢课程、帮助和优秀的解释代码。再次非常感谢。我不确定如何或是否必须将此标记为已接受的答案。如果这是一个分配点的网站或什么。我将环顾四周,看看是否可以找到答案,因为这就是答案我一直在寻找并希望:)。谢谢当悬停在回复顶部时,你应该会看到一个灰色的勾号,单击它,它会将其标记为已接受的答案。这几乎也适用于stack overflow的所有其他网站。Shimmy你还在吗?是的,我还在,dashley怎么了?是的,我在
Public Class fgtDetails  ' 
    Public ServiceClass As String
    Public typeQuery As String
    Public pickupDate As Integer
    Public productCode As String
End Class
Public Sub CreateJson()
    'Create Wrapper Object
    Dim Load As New fgtload

    Load.Login = New fgtLoginData With { 'Create Login Data
        .Username = "XXX",
        .Password = "pwxXXxx",
        .BusID = 123456789,
        .BusRole = "Third Party",
        .PaymentTerms = "Prepaid"
    }

    Load.Details = New fgtDetailsData With { 'Create Details
        .ServiceClass = "STD",
        .TypeQuery = "QUOTE",
        .PickupDate = "20200221",
        .ProductCode = "DFQ"
    }

    Load.OriginLocation = New fgtLocationnData With { 'Create Origin
        .City = "Keyport",
        .State = "NJ",
        .PostalCode = 7735,
        .Country = "USA",
        .LocationType = "COMM"
    }

    Load.DestinationLocation = New fgtLocationnData With { 'Create Destination
        .City = "Beverly Hills",
        .State = "CA",
        .PostalCode = 90210,
        .Country = "USA",
        .LocationType = "COMM"
    }

    'Create Commodities

    Dim Commodity1 As New fgtCommodity With {
        .PackageLength = 48,
        .PackageWidth = 48,
        .PackageHeight = 48,
        .Weight = 1500,
        .HandlingUnits = 1,
        .PackageCode = "PLT"
    }

    'Add commodity to load

    Load.ListOfCommodities.commodity.Add(Commodity1)


    'Serialize wrapper object

    Dim Json As String = JsonConvert.SerializeObject(Load)
End Sub
Public Class fgtload 'Primary wrapper
    Public Login As New fgtLoginData
    Public Details As New fgtDetailsData
    Public OriginLocation As New fgtLocationnData
    Public DestinationLocation As New fgtLocationnData
    Public ListOfCommodities As New fgtCommodityWrapper
End Class
Public Class fgtLoginData 'Login Data
    Public Username As String
    Public Password As String
    Public BusID As String
    Public BusRole As String
    Public PaymentTerms As String
End Class
Public Class fgtDetailsData 'Details Data
    Public ServiceClass As String
    Public TypeQuery As String
    Public PickupDate As String
    Public ProductCode As String
End Class
Public Class fgtLocationnData 'Location data for both Origin and Destination
    Public City As String
    Public State As String
    Public PostalCode As String
    Public Country As String
    Public LocationType As String
End Class
Public Class fgtCommodityWrapper 'Commodity Data
    Public commodity As New List(Of fgtCommodity) ' Lists get serialized into arrays
End Class
Public Class fgtCommodity
    Public PackageLength As Double 'Doubles to allow floating-point numbers
    Public PackageWidth As Double
    Public PackageHeight As Double
    Public Weight As Double
    Public HandlingUnits As Integer
    Public PackageCode As String
End Class
{
    "Login": {
        "Username": "XXX",
        "Password": "pwxXXxx",
        "BusID": "123456789",
        "BusRole": "Third Party",
        "PaymentTerms": "Prepaid"
    },
    "Details": {
        "ServiceClass": "STD",
        "TypeQuery": "QUOTE",
        "PickupDate": "20200221",
        "ProductCode": "DFQ"
    },
    "OriginLocation": {
        "City": "Keyport",
        "State": "NJ",
        "PostalCode": "7735",
        "Country": "USA",
        "LocationType": "COMM"
    },
    "DestinationLocation": {
        "City": "Beverly Hills",
        "State": "CA",
        "PostalCode": "90210",
        "Country": "USA",
        "LocationType": "COMM"
    },
    "ListOfCommodities": {
        "commodity": [
            {
                "PackageLength": 48.0,
                "PackageWidth": 48.0,
                "PackageHeight": 48.0,
                "Weight": 1500.0,
                "HandlingUnits": 1,
                "PackageCode": "PLT"
            }
        ]
    }
}