【问题标题】:Can i create datatable using JSON string with an array value using vb?我可以使用带有数组值的 JSON 字符串使用 vb 创建数据表吗?
【发布时间】:2015-11-20 07:15:48
【问题描述】:

我已经使用 json 字符串创建了一个数据表,但是,我的 json 字符串中的一些标题包含这样的数组:

[{"Header1":"123","Header2":["asdasda"]}]

我使用 json 成功创建了一个数据表,但它没有显示包含 Header2 中的数组值的标题。这是我创建数据表的示例代码:

 strJson = Session("JsonStr").ToString
Dim tb As DataTable
tb = JsonConvert.DeserializeObject(Of DataTable)(strJson.ToString)

每次我尝试将数据表获取到字符串时,它都会出现。但是,它只显示System.string[]。使用我给出的json示例,输出为:

Header1=123 | Header2=System.string[]

代替获取 System.string[],它可以获取数组中的值(“asdasda”)吗?这是我将数据表传输到字符串的代码:

            Dim dr As DataRow
            Dim dc As DataColumn
            Dim sConcat As String = ""
            For Each dr In UpdatedTable.Rows
                For Each dc In UpdatedTable.Columns
                    sConcat = sConcat + dc.ColumnName + "= " + dr.Item(dc) + " | "
                Next
            Next dr

【问题讨论】:

    标签: asp.net arrays json vb.net datatable


    【解决方案1】:

    您在正确的轨道上,但反序列化为类型可能会更容易。否则,如果第二列是一个数组,那么您需要通过索引访问其中的数据。您在结果中看到System.string[](字符串数组),因为您只是引用数组对象而不是数组中的数据

    dr.Item(dc)(0)
    

    由于您无法提前知道循环数组中有多少项,因此您需要将第 1 列的数据转换回数组 - Row.Item 都是 Object,因此它们可以保存任何类型的数据。

    ' sample json, with 2 Hdr2 items
    ' the XML is just an easy way to have strings with quotes
    ' I added an item for testing purposes
    Dim jstr = <str>
                   [{"Header1":"123","Header2":["asdasda", "ziggy"]}]
                </str>.Value
    
    Dim dt = JsonConvert.DeserializeObject(Of DataTable)(jstr)
    
    Dim sRowData As String = ""
    For n As Integer = 0 To dt.Rows.Count - 1
        sRowData = dt.Columns(0).ColumnName & " = " & dt.Rows(n).Item(0).ToString & " | "
        sRowData &= dt.Columns(1).ColumnName & " = "
    
        ' convert col 1 to an array, Join the elements
        Dim names As String() = CType(dt.Rows(n).Item(1), String())
        sRowData &= String.Join(", ", names)
    
        Console.WriteLine(sRowData)
    Next n
    

    输出:

    标题1 = 123 | Header2 = asdasda, ziggy

    我避免使用String.Join 来迭代数组,但迭代会很简单:

    Dim names As String() = CType(dt.Rows(n).Item(1), String())
    
    For j As Int32 = 0 To names.Length - 1
        sRowData &= names(j)
    Next
    

    由于dt.Rows(n).Item(1) 是一个我们无法迭代的对象,你仍然需要在循环之前将其转换为字符串数组。

    最后,您应该打开Option Strict。由于单元格/项目数据存储为Object,启用 Option Strict,编译器会告诉您这种代码:+ dr.Item(dc) + " | " 不太正确。

    【讨论】:

    • 什么是Dim jstr = &lt;str&gt; [{"Header1":"123","Header2":["asdasda", "ziggy"]}] &lt;/str&gt;.Value
    • 它是一种 XML 文字 - 一种将引号粘贴/键入字符串的简单方法。它有时用于SQL Statements 以允许格式化
    • 我记得自 VS2010(可能是 2012 年)以来的 VB.NET(不是 VBScript)
    • 意识到这不是经典的 ASP 又被 OP 愚弄了!
    • 这与问题没有太大关系——我想展示新的测试 JSON 并这样做,而不是粘贴新的 json 报价。 OP 没有说他们从哪里得到它(DL,他们自己的串行器等)
    猜你喜欢
    • 1970-01-01
    • 2013-09-24
    • 2021-12-29
    • 2015-06-02
    • 1970-01-01
    • 2014-01-20
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多