Проблемы десериализации данных JSON в VB.NET - PullRequest
3 голосов
/ 03 февраля 2012

Я пытаюсь десериализовать простой массив JSON в объекты .NET, используя библиотеку JSON.NET в Visual Basic.

Ради жизни я не могу понять, что я делаю здесь неправильно.Моя строка JSON десериализуется в соответствующие объекты (всего 9), но ни одно из свойств не заполняется.

Мой код:

Public Class result

  Public Property id As Integer

  Public Property vote_percentage As String

  Public Sub New()

  End Sub

  Public Sub New(ByVal id As Integer, ByVal vote_percentage As String)
    Me.id = id
    Me.vote_percentage = vote_percentage
  End Sub

End Class

Данные JSON, которые я пытаюсь десериализовать, выглядят так:

[{"finalist": {"id":12, "vote_percentage": "28"}}, { "финалист": { "ID": 13, "vote_percentage": "6"}}, { "финалист": { "ID": 14, "vote_percentage":"4"}}, { "финалист": { "ID": 15, "vote_percentage": "3"}}, { "финалист": { "ID": 16, "vote_percentage": "7"}},{ "финалист": { "ID": 17, "vote_percentage": "1"}}, { "финалист": { "ID": 18, "vote_percentage": "47"}}, { "финалист": {"id": 19, "voice_percentage": "2"}}, {"finalist": {"id": 20, "voice_percentage": "1"}}]

Наконец, моя десериализация:

Dim Results As New List(Of result)

Results = JsonConvert.DeserializeObject(Of List(Of result))(_result)

В результате получается 9 объектов, которым не назначены значения свойств.

Я ломаю себе голову, поэтому, если бы кто-то бросил мне кость, я был бы признателен.

Спасибо.

ОБНОВЛЕНИЕ:

Итак, я внес изменения, которые заставили это работать:

  1. Изменен мой класс результатов, чтобы он содержалфиналист свойства типа finalist
  2. Создан финалист нового класса со свойствами id и voice_percentage

    Public Class finalist
    
        Public Property id As Integer
    
        Public Property vote_percentage As String
    
        Public Sub New()
    
        End Sub
    
        Public Sub New(ByVal id As Integer, ByVal vote_percentage As String)
            Me.id = id
            Me.vote_percentage = vote_percentage
        End Sub
    End Class
    
    Public Class result
    
        Public Property finalist As finalist
    
        Public Sub New()
            finalist = New finalist
        End Sub
    
        Public Sub New(ByVal id As Integer, ByVal vote_percentage As String)
            Me.finalist = New finalist(id, vote_percentage)
        End Sub
    
    End Class
    

Оставил десериализацию в покое:

_result = System.Text.Encoding.ASCII.GetString(data)

Dim Results As New List(Of result)

Results = JsonConvert.DeserializeObject(Of List(Of result))(_result)

RaiseEvent VoteCompleted(loopCounter, _VoteCount, time, _result)

И это работает.

Заметка для новых людей (таких как я).При использовании JSON.NET необходимо иметь методы конструктора (т. Е. Sub New), чтобы свойства устанавливались во время вызова десериализации.

1 Ответ

1 голос
/ 04 февраля 2012

Я не знаю JSON.NET, но могу сказать, что у вас есть массив объектов, структура которого отличается от той, которую определяет ваш класс VB.NET.

Вы можете увидеть это более четко, если отформатируете свой JSON:

[
  {
    "finalist": {
      "id": 12,
      "vote_percentage": "28"
    }
  },

  {
    "finalist": {
      "id": 13,
      "vote_percentage": "6"
    }
  },

  ...
]

Я догадываюсь (поскольку я очень мало знаю о платформе .NET), что JSON.NET требует список экземпляров класса с такой же структурой - поэтому определение класса, подобное этому (псевдокод) :

class item
    public property finalist as result

class result
    public property id as Integer
    public property vote_percentage as String

То, что вы также можете захотеть сделать, - это просто избавиться от класса item и использовать объекты result, как это прямо в вашем JSON:

[
  {
    "id": 12,
    "vote_percentage": "28"
  },

  {
    "id": 13,
    "vote_percentage": "6"
  },

  ...
]

Таким образом, у вас есть упрощенный массив объектов, представляющих result экземпляров, без кажущихся бесполезными "объектов-оболочек" (то есть тех, которые представляют item экземпляров).

...