使用JSON.net反序列化

时间:2017-02-07 11:06:08

标签: .net vb.net json.net

我对json,JSON.net以及所有这些都很新。在这里阅读了类似的问题后,我无法使我的代码正常工作。 究竟是什么错误?我有什么监督? 是否可以跳过“链接”和“元”类用于测试目的,还是必须定义每个属性?

我有以下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
   }
}

据我所知,我需要三个班级:例如代码,链接和元。

我创建了一个“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

我创建了一个类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

当我尝试反序列化时,我得到“没有”,如“CoolOutput”

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

1 个答案:

答案 0 :(得分:4)

您的课程非常接近,看起来您可能尝试了一些改进,例如将codes更改为Codes,但这样做的属性不再匹配。您可以更改类名但不能更改属性名称(至少不是这样):

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

使用现在可用的AutoImplement属性意味着您可以跳过所有GetSet样板代码。 VS也会为你创建课程:
修改菜单 - &gt; 选择性粘贴 - &gt; 将Json粘贴为类

如果有数组/列表属性,有时必须调整类。例如,机器人可以写:

Public Property elements() As Element

应该是:

Public Property elements As Element()

容器类显示如何使用<JsonProperty("pname")>更改属性名称。通常需要这样做才能为属性名称创建别名,这是VB中的关键词(ReturnError等)。在这种情况下,我将codeslinks更改为Lists

    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

结果:

  

6
  标题1
  标题2
  标题3