Deserializar usando JSON.net
vb.net (1)
Sus clases son bastante cercanas, parece que posiblemente intentó mejorar un poco las cosas, como cambiar los
codes
a
Codes
pero al hacerlo, las propiedades ya no coinciden.
Puede cambiar los nombres de clase pero no los nombres de propiedad (al menos no de esa manera):
Public Class CodeLinkContainer
<JsonProperty("codes")>
Public Property Codes As IList(Of Code)
<JsonProperty("links")>
Public Property Links As IList(Of Link)
<JsonProperty("meta")>
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
El uso de las propiedades de AutoImplement, disponibles desde hace un tiempo, significa que puede omitir todo el código
Get
,
Set
repetitivo.
VS creará las clases para ti también:
Menú Editar
->
Pegado especial
->
Pegar Json como clases
A veces tiene que ajustar la clase si hay una propiedad de matriz / lista. Por ejemplo, los robots pueden escribir:
Public Property elements() As Element
Cuando debería ser:
Public Property elements As Element()
La clase contenedor muestra cómo usar
<JsonProperty("pname")>
para cambiar el nombre de la propiedad si lo desea.
Esto a menudo debe hacerse para crear un alias para un nombre de propiedad que es una palabra clave en VB (
Return
,
Error
, etc.).
En este caso, cambié los
codes
y
links
para que fueran
Lists
como lo hiciste.
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
Resultado:
6 6
TÍTULO 1
TÍTULO 2
TÍTULO 3
Soy muy nuevo en json, JSON.net y todo eso. Después de leer preguntas similares aquí, no puedo hacer que mi código funcione. ¿Cuál es exactamente mi error? ¿Qué he supervisado? ¿Es posible omitir las clases "enlaces" y "meta" con fines de prueba o tengo que definir CADA propiedad?
Tengo la siguiente salida REST:
{
"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
}
}
Como entendí, necesito tres clases: por ejemplo, códigos, enlaces y meta.
Creé una clase "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
Y creé una clase 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
Cuando trato de deserializarlo obtengo "nada" como en "CoolOutput"
Dim CoolOutput As New clsWerteliste
CoolOutput = JsonConvert.DeserializeObject(Of clsWerteliste)(jsonstring)