【问题标题】:Deserialize and serialize Json data in WinformWinform中对Json数据进行反序列化和序列化
【发布时间】:2020-06-30 09:47:36
【问题描述】:

我有一个带有组合框和一些文本框的 winform。我通过 REST API 获取 Json 数据并通过 Json.NET 和类文件对其进行反序列化。

JsonHelper

   Imports Newtonsoft.Json

Public Module JsonHelper

    Public Function FromClass(Of T)(data As T, Optional isEmptyToNull As Boolean = False, Optional jsonSettings As JsonSerializerSettings = Nothing) As String

        Dim response As String = String.Empty

        If Not EqualityComparer(Of T).Default.Equals(data, Nothing) Then
            response = JsonConvert.SerializeObject(data, jsonSettings)
        End If

        Return If(isEmptyToNull, (If(response = "{}", "null", response)), response)

    End Function

    Public Function ToClass(Of T)(data As String, Optional jsonSettings As JsonSerializerSettings = Nothing) As T
        Dim response = Nothing

        If Not String.IsNullOrEmpty(data) Then
            response = If(jsonSettings Is Nothing,
                JsonConvert.DeserializeObject(Of T)(data),
                JsonConvert.DeserializeObject(Of T)(data, jsonSettings))
        End If

        Return response

    End Function

End Module

    Imports Newtonsoft.Json

Namespace Models

    Public Class Header

        <JsonProperty("Name")>
        Public Property Name As String

        <JsonProperty("DisplayAt")>
        Public Property DisplayAt As String
    End Class

类文件

    Public Class DataSource

        <JsonProperty("Id")>
        Public Property Id As String

        <JsonProperty("Name")>
        Public Property Name As String

        <JsonProperty("Headers")>
        Public Property Headers As Header()

        <JsonProperty("Rows")>
        Public Property Rows As String()()

        <JsonProperty("TotalRows")>
        Public Property TotalRows As Integer

        <JsonProperty("LastUpdated")>
        Public Property LastUpdated As DateTime

        <JsonProperty("CompanyId")>
        Public Property CompanyId As Integer
    End Class

    Public Class Category

        <JsonProperty("DataSource")>
        Public Property DataSource As DataSource
    End Class

End Namespace

组合框由 Json 文件中的数据填充,并通过 bindingsource 将文本框连接到组合框。因此,如果您选择另一行,文本框的值会发生变化。

绑定源

Dim bindingSource As BindingSource = New BindingSource()
        bindingSource.DataSource = dt
        bindingSource.Sort = "Weergave DESC"
        ListBox1.DataSource = bindingSource

        ListBox1.DisplayMember = "Weergave"
        ListBox1.ValueMember = "Id"
        'ListBox1.Sorted = True

        txtWeergave.DataBindings.Clear()
        txtWeergave.DataBindings.Add(New Binding("Text", ListBox1.DataSource, "Weergave", True, DataSourceUpdateMode.OnPropertyChanged))
        txtProjectnaam.DataBindings.Clear()
        txtProjectnaam.DataBindings.Add(New Binding("Text", ListBox1.DataSource, "Projectnaam", True, DataSourceUpdateMode.OnPropertyChanged))
        txtProjectnummer.DataBindings.Clear()
        txtProjectnummer.DataBindings.Add(New Binding("Text", ListBox1.DataSource, "Projectnummer", True, DataSourceUpdateMode.OnPropertyChanged))
        txtServicemonteur.DataBindings.Clear()
        txtServicemonteur.DataBindings.Add(New Binding("Text", ListBox1.DataSource, "Servicemonteur", True, DataSourceUpdateMode.OnPropertyChanged))

我不想通过 PUT 请求对数据进行一些更改并更新数据库。 因此,我做了以下例程:

    Private Sub PutData()
    Dim request As WebRequest = WebRequest.Create("my url")
    request.ContentType = "application/json"
    request.Method = "PUT"
    ' Get the response.
    Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
    ' Get the stream containing content returned by the server.
    Dim dataStream As Stream = response.GetResponseStream()
    ' Open the stream using a StreamReader for easy access.
    Dim reader As New StreamReader(dataStream)
    ' Read the content.
    Dim responseFromServer As String = reader.ReadToEnd()
    'Dim JObject As Object


    Dim rawJson As String = responseFromServer

    Dim dataSource As String = JsonHelper.FromClass(Of Category)(rawJson).DataSource

End Sub

以下事情对我来说不是很清楚。 如果我在文本框中进行更改,则组合框中也会进行更改,因为它们已通过绑定源相互连接。但是 Class 文件中的值是否也会发生变化?

如何更改文本框的值并通过 PUT 请求更新数据源?

【问题讨论】:

    标签: json vb.net visual-studio-2017 json.net


    【解决方案1】:

    这不是很清楚,因为您的问题中缺少一些东西,例如您的绑定配置,但是..

    一般来说,我不希望事情是“当我更改文本框时,组合也会改变”。让我们以一个人为的例子来说明一个带有姓名和种族的 Person 类。名称是一个字符串,将绑定到一个文本框。种族是一个固定的值列表,我希望一个组合被绑​​定,使得组合的数据源、显示成员和值成员与种族列表的列/属性相关,然后组合的选定值被绑定到人的种族环境。这样,更改组合中的选定项目会将其种族编辑为固定种族列表中的其他值之一。更改名称框中显示的值不会更改有关种族的任何内容。如果您有一个由 bindingsource 管理的多个 Person 的列表,那么您可以导航 bindingsource 以显示不同的人并对其进行编辑。可能最容易查看是否还添加了一个 datagridview,尽管是临时的,绑定到人员绑定的同一个绑定源;更改网格的当前行导航绑定源,文本框/组合框将更改以显示新人的详细信息

    PUT 请求更容易回答;您通过将您编辑的类重新序列化为 JSON 来为服务器制定一个 json 块,然后将其作为 put 请求的主体发送

    request.Method = "PUT"
    
    'formulate a body
    Dim postData = JsonHelper.FromClass(editedPerson)
    
    Dim encoding As New ASCIIEncoding() 'or whatever
    Dim byte1 As Byte() = encoding.GetBytes(postData)
    
    request.ContentType = "application/json"
    request.ContentLength = byte1.Length
    Dim reqStream = request.GetRequestStream()
    reqStream.Write(byte1, 0, byte1.Length)
    reqStream.Close()
    
    
    ' Get the response.
    Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
    

    顺便说一句,至少在 C# 中,您可以右键单击您的项目名称并选择添加 REST 客户端,给它您的 Web 服务的 swagger/openapi 描述符的 URL,它会为您创建所有客户端类可以大大简化交互。虽然它只是 C# 的东西(它基于我认为不支持 VB 的 autorest),但 C# 和 VB 在内部是相同的,所以你可以在你的 VB 旁边添加一个 C# 项目,纯粹是为了创建一个休息客户端,然后将对 c# 项目的引用导入到您的 VB 中

    【讨论】:

    • 感谢您的回复 Caius Jard。我也添加了边界源作为问题。我已经用从 Json 创建的数据表女巫填充了组合框。但我的问题是如何填充所有更改为 Json 的文本字段并通过 PUT 请求更新我的数据库。
    • 哦,我现在看到了混乱。 1-你没有组合框,你有一个列表框;不同的东西。 2-您的文本框绑定到与列表框相同的绑定源;如果您将文本框绑定到 bindingsource 而不是 listbox1.DataSource
    • 对不起,我的错误:-)
    • 我的问题是如何填充所有文本字段 - 你不填充文本框;绑定就是这样做的。您应该会自动在文本框中看到一个值。如果您更改它存储回模型中的值(据我所知,您已将其称为 dataSource;一个相当不起眼的名称顺便说一句 - 它会更好作为 Person、Order、Employee 等而不是 Info、Data、Object , 数组等) 自动。您检索要发送到服务器的模型值并将其发送。如果服务器接受多个,您可以发送一个集合。如果它接受单曲,您将一一发送
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 2020-10-23
    • 2012-06-08
    • 2017-11-19
    相关资源
    最近更新 更多