使用 JSON.net 反序列化 [英] Deserialize using JSON.net
问题描述
我对 json、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?
我有以下 REST 输出:
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.
我创建了一个类clscodes":
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
我创建了一个类 clsValuelist:
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
当我尝试反序列化它时,我在CoolOutput"中得到什么都没有"
When I try to deserialize it I get "nothing" as in "CoolOutput"
Dim CoolOutput As New clsWerteliste
CoolOutput = JsonConvert.DeserializeObject(Of clsWerteliste)(jsonstring)
推荐答案
你的班级很接近,看起来你可能尝试过美化一些东西,比如将 codes
更改为 代码
但这样做的属性不再匹配.您可以更改类名但不能更改属性名(至少不是那样):
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 properties no longer match. You can change class names but not property names (at least not that way):
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 属性(现已推出一段时间)意味着您可以跳过所有 Get
、Set
样板代码.VS 也会为你创建类:
编辑菜单 -> 选择性粘贴 -> 将 Json 粘贴为类
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
如果有数组/列表属性,您有时必须调整类.例如,机器人可能会写:
You sometimes have to tweak the class if there is an array/list property. For instance, the robots may write:
Public Property elements() As Element
应该什么时候:
Public Property elements As Element()
容器类展示了如何使用
来更改属性名称(如果您愿意).这通常需要为属性名称创建别名,该名称是 VB 中的关键字(Return
、Error
等).在本例中,我像您一样将 codes
和 links
更改为 Lists
.
The container class shows how to use <JsonProperty("pname")>
to change the property name if you wish. This often needs to be done to create an alias for a property name which is a key word in VB (Return
, Error
etc). In this case, I changed 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
结果:
6
标题 1
标题 2
标题 3
6
TITLE 1
TITLE 2
TITLE 3
这篇关于使用 JSON.net 反序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!