Deserializar usando JSON.net

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” para fines de prueba o tengo que definir CADA propiedad?

Tengo el siguiente resultado 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 no 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 bash deserializarlo obtengo “nada” como en “CoolOutput”

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

Tus clases son bastante parecidas, parece que posiblemente has intentado cambiar las cosas un poco, como cambiar los codes a Codes pero al hacerlo las propiedades ya no coinciden. Puede cambiar los nombres de las clases pero no los nombres de las propiedades (al menos no de esa manera):

 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 

El uso de las propiedades de AutoImplement, disponible desde hace algún tiempo, significa que puede omitir todo el código de referencia Get , Set . VS creará las clases para usted también:
Menú Editar -> Pegar especial -> Pegar Json como clases

A veces tienes que modificar 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 para cambiar el nombre de la propiedad si lo desea. Esto a menudo necesita hacerse para crear un alias para un nombre de propiedad que es una palabra clave en VB ( Return , Error , etc.). En este caso, cambié codes y links para que sean Lists como lo hizo.

  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
TÍTULO 1
TÍTULO 2
TÍTULO 3