Класс в JSON VB.Net - PullRequest
       12

Класс в JSON VB.Net

0 голосов
/ 05 ноября 2018

Итак, у меня есть класс, который я сериализую в Json. Все идет хорошо, до этого вложенного класса, который дает мне System.NullReferenceException = {"Ссылка на объект не установлена ​​на экземпляр объекта."} . При написании кода intelisense распознает вложенный класс, но, очевидно, я где-то пропускаю объявление.

Корневой класс:

    Public Class RootObject
    Private _metadata As List(Of Metadata)
    Public Property metadata() As List(Of Metadata)
    Get
        Return _metadata
    End Get
    Set(ByVal value As List(Of Metadata))
        _metadata = value
    End Set
    End Property

    Private _test_gl As List(Of TestGl)
    Public Property test_gl() As List(Of TestGl)
    Get
        Return _test_gl
    End Get
    Set(ByVal value As List(Of TestGl))
        _test_gl = value
    End Set
    End Property
End Class

Вот определение класса TestGl:

    Public Class TestGl
    Private _ref_key_3 As String
    <JsonProperty("ref-key-3")> _
    Public Property ref_key_3() As String
    Get
        Return _ref_key_3
    End Get
    Set(ByVal value As String)
        _ref_key_3 = value
    End Set
    End Property

    Private _currency_amount As CurrencyAmount
    <JsonProperty("currency-amount")> _
    Public Property currency_amount() As CurrencyAmount
    Get
        Return _currency_amount
    End Get
    Set(ByVal value As CurrencyAmount)
        _currency_amount = value
    End Set
    End Property
End Class

И, наконец, класс CurrencyAmount:

    Public Class CurrencyAmount
    Private _currency As String
    <JsonProperty("currency")> _
    Public Property currency() As String
    Get
        Return _currency
    End Get
    Set(ByVal value As String)
        _currency = value
    End Set
    End Property

    Private _amount As String
    <JsonProperty("amount")> _
    Public Property amount() As String
    Get
        Return _amount
    End Get
    Set(ByVal value As String)
        _amount = value
    End Set
    End Property
End Class

Ниже приведен код заполнения объекта данными:

        Dim Root As RootObject
    Dim Meta_Data As New List(Of Metadata)()
    Dim Test_Gl As New List(Of TestGl)()

    Root = New RootObject
    Root.metadata = New List(Of Metadata)()
    Root.test_gl = New List(Of TestGl)
    Meta_Data = Root.metadata
    Test_Gl = Root.test_gl

И здесь я присваиваю ему значения:

                        Test_Gl.Add(New AccountGl)
                    Test_Gl(ItemNo).ref_key_3 = "test"
                    Test_Gl(ItemNo).currency_amount.currency = "EUR"
                    Test_Gl(ItemNo).currency_amount.amount = "100"

Строка, где назначается currency_amount.currency, идет не так, и я смотрю на это уже несколько часов. Я этого не вижу Любой вклад будет высоко оценен.

Свойства написаны полностью, так как мне нужно работать над этим проектом в VS2008.

1 Ответ

0 голосов
/ 05 ноября 2018

Я подозреваю, что где-то вам нужно инициализировать _currency_amount новым экземпляром CurrencyAmount. Я не вижу new CurrencyAmount нигде.

Я подозреваю, что вы на самом деле не хотите, чтобы свойство currency_amount было установлено, в противном случае вы должны были установить его в своем примере кода назначения внизу. Если это так, то вам, вероятно, даже не нужно определять член Set для TestGl (это должно быть ReadOnly, что влияет только на currency_amount, а не _currency_amount.currency). Вместо этого вы должны создать экземпляр по умолчанию CurrencyAmount и назначить его этому полю во время создания TestGl. Это может быть так же просто, как изменить объявление _currency_amount на:

Private _currency_amount As New CurrencyAmount

В качестве альтернативы, и это может быть решением, которое вам нужно использовать с сериализуемым объектом JSON, вы сохраняете определение элемента Set и просто добавляете строку в свой тестовый код для инициализации currency_amount перед его использованием:

Test_Gl(ItemNo).currency_amount = new CurrencyAmount
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...