Десериализация вложенных массивов JSON - PullRequest
1 голос
/ 03 мая 2019

У меня есть строка 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
}]"

1 Ответ

1 голос
/ 04 мая 2019

Как описано, вам нужно добавить класс, который обрабатывает вложенные Rules объекты.
В вашей исходной структуре класса класс Rules не имеет rules Свойство, которое может содержать второй уровень вложенности.
Но вам также нужно обрабатывать неопределенный уровень вложенности, поскольку другие вложенные классы могут иметь дополнительный вложенный Rules объект.

Вы можете добавить новый класс, который обрабатывает этот тип вложений, ссылаясь на себя:

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

Кроме того, он должен содержать массив / список Valueобъекты.

Обратите внимание, что я использовал Массивы вместо Списки : просто проверить результаты проще, вы можете использовать List(Of [Type]), есливы предпочитаете, окончательный результат не меняется.


Этот пример класса (с именем Queries) реализует такую ​​структуру.
Он также включает в себя сериализацию и десериализацию (упрощенно, без проверки и обработки ошибок)как static (shared) методы.

Предположим, jsonInput - это ваш объект JSON:

Десериализация в List(Of QueryBuilder):

Dim myQueries = Queries.Deserialize(jsonInput)

Сериализацияa List(Of QueryBuilder) обратно к исходному объекту JSON.
Обратите внимание, используя визуализатор JSON в Visual Studio, что структура воспроизводится точно так же, как и оригинал:

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
...