【问题标题】:JSON (newtonsoft) deserialize using MS Access field names, in VB.netJSON (newtonsoft) 在 VB.net 中使用 MS Access 字段名称反序列化
【发布时间】:2016-03-17 13:58:38
【问题描述】:

我正在尝试反序列化通常需要两个类的 JSON 字符串,我想用从 MS Access 字段名称获得的数组中的项目替换其中一个类(请参阅注释掉的类)。

这样,如果数据库表发生变化(只有 Access 表本身和源 JSON),我就不必修改我的代码。

在下面的代码中,我被困在如何定义公共属性“数据”以及 js.data (SampleClass.data) 的定义上。看到我的??????问号!我正在尝试使用 List (Of String) 来存储字段名称,并希望将这些列表存储在 Data(0)、Data(1)、Data(2) 等中,因此每个 Data 元素都有字段名称列表,以及每条记录的关联值。

我想按如下方式获取我的数据: Node.js (SampleClass) 包含未知数量的“数据”列表(根据在 JSON 字符串中找到的数量),每个列表都包含从 Access 获得的字段名。 然后我想将结果插入到 MS Access 表中,每个“数据”列表都是一条记录。

注意:我已将“rawresp”(来自 HTTP 请求)替换为非常小的 JSON 字符串提取。

谁能帮忙,不胜感激。我希望这一切都有意义

谢谢, 阿德里安

Imports Newtonsoft.Json

'link to create classes
'http://www.httputility.net/json-to-csharp-vb-typescript-class.aspx
'example of json script
'http://stackoverflow.com/questions/21676708/simple-working-example-of-json-    net-in-vb-net

'Public Class Datum
'Public ABC As String
'Public DEF As String
'Public GHI As Integer
'Public JKL As Integer
'Public MNO As String
'Public PQR As String
'Public STU As String
'Public VWX As String
'Public YZA As String
'Public BCD As Integer
'Public EFG As Integer
'Public HIJ As String
'Public KLM As String
'Public NOP As String
'Public QRS As String

'End Class

Public Class SampleClass
    Public Property Success As Boolean
    ?????? Public Property Data As List(Of String)

End Class


Module JSON
    Sub getjson()

    'Try
    cleanup(Nothing, Nothing)
    Dim daoEngine As New dao.DBEngine, db As dao.Database
    db = daoEngine.OpenDatabase(DBPath)
    Dim rst As dao.Recordset = Nothing
    rst = db.OpenRecordset("tUnit")                                    'open table
    Dim fields(rst.Fields.Count) As String

    For j = 0 To rst.Fields.Count
        fields(j) = rst.Fields(j).Name
    Next

    Dim js As New SampleClass

    ??????  Dim js.data As List(Of js.Data)(fields)


    Dim rawresp As String
    Dim request As Net.HttpWebRequest
    Dim response As Net.HttpWebResponse = Nothing
    Dim reader As IO.StreamReader

    request = DirectCast(Net.WebRequest.Create("http://10.32.27.17/api/endusers"), Net.HttpWebRequest)
    response = DirectCast(request.GetResponse(), Net.HttpWebResponse)
    reader = New IO.StreamReader(response.GetResponseStream())
    rawresp = reader.ReadToEnd()

    js = JsonConvert.DeserializeObject(Of SampleClass)("{""success"":true,""data"":[{""ABC"":""Something"",""DEF"":""Other""},{""ABC"":""This"",""DEF"":""That""}]}")

   ?????? For Each i As String In js.Data
        rst.MoveFirst()
        Do While Not rst.EOF                                    'look through to end of table
            If n(rst(i(1)).Value) Like i(1) Then
                For Each j In i
                    rst.Edit()
                    rst(j).Value = j
                    rst.Update()
                Next

            End If
            rst.MoveNext()                                      'move to next record
        Loop
    Next


    cleanup(db, Nothing)

    'Catch ex As Exception
    ' Debug.Print(ex.Message)
    'End Try




    End Sub
End Module

【问题讨论】:

  • 那是无效的 json
  • 如果你指的是额外的引号,它们在VB网络字符串中是必需的
  • 我很清楚。但是,如果您将结果提供给它不会验证的任何机器人。通过以导致错误 json 的方式创建它很容易拥有太多或太少。 JSON.NET 将允许您非常轻松地重命名反序列化对象中的属性
  • 粘贴这个 {"success":true,"data":[{"ABC":"Something","DEF":"Other"},{"ABC":"This"," DEF":"那个"}]}

标签: json vb.net class serialization


【解决方案1】:

Data 不只是List(of Dictionary(of string, string))吗?

所以 - Data(0).Item("ABC") = "Something" ... 等等。

不确定 newtonsoft 是如何反序列化的,所以这是一个经典的即兴堆栈答案(例如 - 完全物有所值);)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    相关资源
    最近更新 更多