簡體   English   中英

反序列化 JSON 嵌套數組

[英]Deserializing JSON nested arrays

我有一個JSON字符串,我試圖將其反序列化為 .Net 對象。

該代碼有效,直到它遇到嵌套數組。 然后它只返回空值。
在下面的例子中,當我調試和查看處理過的對象時,它只會有:

規則:

0:  Will contain all data for the first node (project_number)  
1:  Will contain all data for the second node (agreement_number)  
2:  All fields will be Nothing  

Condition: AND  
Valid: true  

如何反序列化整個對象? 請注意, JSON字符串來自一個庫 ( https://querybuilder.js.org/ ),所以我對如何創建字符串猶豫不決。

這是我的代碼:

 Dim TestObj = JsonConvert.DeserializeObject(Of List(Of JsonObject))(TestString)

<Serializable()>
Public Class JsonObject
    Public Property condition As String
    Public Property Rules As List(Of Rules)
    Public Property valid As Boolean
End Class

<Serializable()>
Public Class Rules
    Public Property id As String
    Public Property field As String
    Public Property type As String
    Public Property input As String
    Public Property [operator] As String
    Public Property value As String
End Class

Public Property TestString As String = "[
{
   'condition':'AND',
   'rules':[
      {
         'id':'project_number',
         'field':'project_number',
         'type':'string',
         'input':'text',
         'operator':'equal',
         'value':'dfgdfs'
      },
      {
         'id':'agreement_number',
         'field':'agreement_number',
         'type':'string',
         'input':'text',
         'operator':'contains',
         'value':'asdfas'
      },
      {
         'condition':'AND',
         'rules':[
            {
               'id':'division',
               'field':'division',
               'type':'string',
               'input':'select',
               'operator':'in',
               'value':[
                  '0',
                  '11719'
               ]
            },
            {
               'condition':'AND',
               'rules':[
                  {
                     'id':'ta',
                     'field':'ta',
                     'type':'string',
                     'input':'select',
                     'operator':'in',
                     'value':[
                        '24740',
                        '24744'
                     ]
                  }
               ]
            }
         ]
      }
   ],
   'valid':true
}]"

如上所述,您需要添加一個處理嵌套Rules對象的類。
在您的原始類結構中, Rules類沒有可以容納第二級嵌套的rules屬性。
但是您還需要處理未確定級別的嵌套,因為其他嵌套類可以具有進一步嵌套的Rules對象。

您可以通過引用自身來添加處理這種嵌套的新類:

Partial Public Class RulesList
    Public Id As String
    Public Value As Long()
    '(...)
    Public Rules As RulesList()
End Class

另外,它必須包含一個數組/ Value對象列表。

請注意,我使用了Arrays而不是Lists :檢查結果更容易,如果您願意,可以使用List(Of [Type]) ,最終輸出不會改變。


這個示例類(名為Queries )實現了這種結構。
它還包括序列化和反序列化(簡化,無錯誤檢查/處理)作為staticshared )方法。

假設jsonInput是您的 JSON 對象:

反序列List(Of QueryBuilder)

Dim myQueries = Queries.Deserialize(jsonInput)

List(Of QueryBuilder)序列化回原始 JSON 對象。
請注意,使用 Visual Studio 中的 JSON 可視化工具,該結構將完全按照原始結構進行復制:

Dim jsonOutput = Queries.Serialize(myQueries)

Queries類:

Imports Newtonsoft.Json

Public Class Queries
    Public Class QueryBuilder
        Public Condition As String
        Public Rules As Rules()
        Public Valid As Boolean
    End Class

    Public Class Rules
        Public Id As String
        Public Field As String
        <JsonProperty("type")>
        Public QueryType As String
        Public Input As String
        <JsonProperty("operator")>
        Public QueryOperator As String
        Public Value As String
        Public Condition As String
        Public Rules As RulesList()
    End Class
    Partial Public Class RulesList
        Public Id As String
        Public Field As String
        <JsonProperty("type")>
        Public QueryType As String
        Public Input As String
        <JsonProperty("operator")>
        Public QueryOperator As String
        Public Value As Long()
        Public Condition As String
        Public Rules As RulesList()
    End Class

    Public Shared Function Deserialize(jsonSource As String) As List(Of QueryBuilder)
        Return JsonConvert.DeserializeObject(Of List(Of QueryBuilder))(jsonSource)
    End Function

    Public Shared Function Serialize(classObject As List(Of QueryBuilder)) As String
        Return JsonConvert.SerializeObject(classObject)
    End Function

End Class

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM