Stefan Meyer Stefan Meyer - 1 year ago 63
Vb.net Question

Deserialize using JSON.net

I am very new to json, JSON.net and all that. After reading similiar questions here I cannot get my code working.
What exactly is my error? What have I overseen?
Is it possible to skip the classes "links" and "meta" for testing purposes or do I have to define EVERY property?

I have got the following REST output:

{
"codes" : [
{
"href" : "https://www.someserver.com/form_definitions/OIlG4GxMyeh0sdrt3AYuaXbauGicW71M/field_definitions/zFEova6LiPM/codes/4Sxnr961xzM",
"rel" : "document_field_definition_code",
"title" : "TITLE 1"
},
{
"href" : "https://www.someserver.com/form_definitions/OIlG4GxMyeh0sdrt3AYuaXbauGicW71M/field_definitions/zFEova6LiPM/codes/buho0CsLc5k",
"rel" : "document_field_definition_code",
"title" : "TITLE 2"
},
{
"href" : "https://www.someserver.com/form_definitions/OIlG4GxMyeh0sdrt3AYuaXbauGicW71M/field_definitions/zFEova6LiPM/codes/RvQoykUM_Sk",
"rel" : "document_field_definition_code",
"title" : "TITLE 3"
}
],
"links" : [
{
"about" : "https://www.someserver.com/form_definitions/OIlG4GxMyeh0sdrt3AYuaXbauGicW71M/field_definitions/zFEova6LiPM/codes?about=1",
"href" : "https://www.someserver.com/form_definitions/OIlG4GxMyeh0sdrt3AYuaXbauGicW71M/field_definitions/zFEova6LiPM/codes",
"method" : "GET",
"rel" : "self",
"title" : null,
"type" : "codes"
},
{
"href" : "https://www.someserver.com/form_definitions/OIlG4GxMyeh0sdrt3AYuaXbauGicW71M/field_definitions/zFEova6LiPM/codes",
"method" : "POST",
"rel" : "codes",
"title" : "create new codes entity"
}
],
"meta" : {
"description" : null,
"last_page" : 1,
"page_offset" : 0,
"page_size" : 50,
"query-template" : "/codes{?query_search,page_offset,page_size,query_identification,embedded,properties,about}",
"total" : 6
}
}


As I unterstood I need three classes: e.g. codes, links and meta.

I created a class "clscodes":

Public Class clsCode
Private m_href As String
Private m_rel As String
Private m_title As String

Public Property Href As String
Get
Return m_href
End Get
Set(value As String)
m_href = value
End Set
End Property

Public Property Rel As String
Get
Return m_rel
End Get
Set(value As String)
m_rel = value
End Set
End Property

Public Property Title As String
Get
Return m_title
End Get
Set(value As String)
m_title = value
End Set
End Property
End Class


And I created a class clsValuelist:

Public Class clsWerteliste

Private m_code As IList(Of clsCode)

Public Property Code() As clsCode()
Get
Return m_code
End Get
Set(value As clsCode())
m_code = value
End Set
End Property
End Class


When I try to deserialize it I get "nothing" as in "CoolOutput"

Dim CoolOutput As New clsWerteliste
CoolOutput = JsonConvert.DeserializeObject(Of clsWerteliste)(jsonstring)

Answer Source

Your classes are pretty close, it looks like you possibly tried to pretty things up a bit such as changing codes to Codes but in so doing the propertied no longer match. You can change class names but not property names (at least not that way):

Public Class CodeLinkContainer
    Public Property codes As IList(Of Code)
    Public Property links As IList(Of Link)
    Public Property meta As Meta
End Class

Public Class Meta
    Public Property description As Object
    Public Property last_page As Integer
    Public Property page_offset As Integer
    Public Property page_size As Integer
    Public Property querytemplate As String
    Public Property total As Integer
End Class

Public Class Code
    Public Property href As String
    Public Property rel As String
    Public Property title As String
End Class

Public Class Link
    Public Property about As String
    Public Property href As String
    Public Property method As String
    Public Property rel As String
    Public Property title As String
    Public Property type As String
End Class

Using AutoImplement properties, available for some time now, means you can skip all the Get, Set boilerplate code. VS will create the classes for you also:
Edit Menu -> Paste Special -> Paste Json As Classes

In this case, I fixed codes and links to be Lists as you did.

    Dim jstr = ... from whereever

    Dim CodeLinks = JsonConvert.DeserializeObject(Of CodeLinkContainer)(jstr)

    Console.WriteLine(CodeLinks.meta.total)
    For Each Item In CodeLinks.codes
        Console.WriteLine(Item.title)
    Next

Result:

6
TITLE 1
TITLE 2
TITLE 3

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download