【问题标题】:Deserializing JSON nested arrays反序列化 JSON 嵌套数组
【发布时间】:2019-09-22 06:48:08
【问题描述】:

我有一个 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
}]"

【问题讨论】:

    标签: asp.net json vb.net json.net jquery-query-builder


    【解决方案1】:

    如上所述,您需要添加一个类来处理嵌套的 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)实现了这种结构。
    它还包括序列化和反序列化(简化,无错误检查/处理)作为static (shared) 方法。

    假设 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
    

    【讨论】:

      猜你喜欢
      • 2019-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      相关资源
      最近更新 更多