.net 反序列化json数组返回null
嗯。。。。试图将json反序列化为“用户”列表,但无法使其工作。 以下是Json: [{“Aatrox”:{“版本”:“5.2.1”,“id”:“Aatrox”,“键”:“266”,“名称”:“Aatrox”,“标题”:“黑暗之刃”,“简介”:“阿特洛克斯是一位传奇战士,是一个被称为达金的古老种族仅存的五名战士之一。他优雅而稳重地挥舞着他的巨刃,以一种令人催眠的风格横扫军团。随着每个敌人的倒下,阿特洛克斯的……”,“信息”:{“攻击”:8,“防御”:4,“魔法”:3,“难度”:4},“图像”:{“完整”:“阿特洛png”,“精灵”:”champion0.png,“group:“champion”,“x:”0,“y:”0,“w:”48,“h:”48},“tags:”战斗机“,”坦克“,”零件类型“,”血井“,”统计数据“{”hp:”537.8,“hpperlevel:”85.0,“mp:”105.6,“mpperlevel:”45.0,“movespeed:”345.0,“盔甲”:24.384,“装甲等级”:3.8,“法术块”:32.1,“法术封锁等级”:1.25,“攻击范围”:150.0,“hpregen:”6.59,“hpperlevel:”0.5,“mpregen:”0,“mpregenperlevel:0.0,“暴击”:0.0,“暴击”:0.0,“攻击伤害”:60.376,“攻击伤害”:3.2,“攻击速度偏移量”:-0.04,“攻击速度”:3.0}},“Ahri”:{“版本”:“5.2.1”,“id”:“Ahri”,“键”:“103”,“名称”:“Ahri”,“标题”:“九尾狐”,“宣传语”:与其他游荡在爱奥尼亚南部森林中的狐狸不同,阿赫里总是感觉到与她周围的魔法世界有一种奇怪的联系;这种联系在某种程度上是不完整的。在内心深处,她觉得她出生的皮肤不适合……,“信息”:{“攻击”:3,“防御”:4,“魔法”:8,“困难”:5},“图像”:{“完整”:“Ahri.png”,“精灵”:”champion0.png“,”组“:”冠军“,”x“,”y“,”w“,”48,“h“,”48},“标签“:”法师“,”刺客“,”角色类型“,”魔法“,”属性“:{”hp“,”514.4,“hpperlevel“,”80.0“,”mp“,”334.0“,”mpperlevel“,”50.0,“移动速度“,”330.0,“护甲“,”20.88,“盔甲等级“,”3.5,“法术块“,”30.0,“法术阻止等级“,”0.0,“攻击范围“,”550.0,“hpregen“,”6.6“,”mpregen“,”mpregenperlevel:0.8,“爆击”:0.0,“爆击等级”:0.0,“攻击伤害”:53.04,“攻击伤害等级”:3.0,“攻击速度偏移”:-0.065,“攻击速度等级”:2.0}}] 我正在使用的代码:.net 反序列化json数组返回null,.net,json,vb.net,serialization,deserialization,.net,Json,Vb.net,Serialization,Deserialization,嗯。。。。试图将json反序列化为“用户”列表,但无法使其工作。 以下是Json: [{“Aatrox”:{“版本”:“5.2.1”,“id”:“Aatrox”,“键”:“266”,“名称”:“Aatrox”,“标题”:“黑暗之刃”,“简介”:“阿特洛克斯是一位传奇战士,是一个被称为达金的古老种族仅存的五名战士之一。他优雅而稳重地挥舞着他的巨刃,以一种令人催眠的风格横扫军团。随着每个敌人的倒下,阿特洛克斯的……”,“信息”:{“攻击”:8,“防御”:4,“魔法”:3,“难度”:4},“图像”:{
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim chlist As ChampionName() = JsonConvert.DeserializeObject(Of ChampionName())(jsonString)
TextBox1.Text += "Count: " & chlist.Count.ToString & vbNewLine
For Each s As ChampionName In chlist
TextBox1.Text += "Name: " & s.name & vbNewLine
Next
End Sub
我试图传递数据的类:
Public Class Info
Public Property attack() As Integer
Get
Return m_attack
End Get
Set
m_attack = Value
End Set
End Property
Private m_attack As Integer
Public Property defense() As Integer
Get
Return m_defense
End Get
Set
m_defense = Value
End Set
End Property
Private m_defense As Integer
Public Property magic() As Integer
Get
Return m_magic
End Get
Set
m_magic = Value
End Set
End Property
Private m_magic As Integer
Public Property difficulty() As Integer
Get
Return m_difficulty
End Get
Set
m_difficulty = Value
End Set
End Property
Private m_difficulty As Integer
End Class
Public Class Image
Public Property full() As String
Get
Return m_full
End Get
Set
m_full = Value
End Set
End Property
Private m_full As String
Public Property sprite() As String
Get
Return m_sprite
End Get
Set
m_sprite = Value
End Set
End Property
Private m_sprite As String
Public Property group() As String
Get
Return m_group
End Get
Set
m_group = Value
End Set
End Property
Private m_group As String
Public Property x() As Integer
Get
Return m_x
End Get
Set
m_x = Value
End Set
End Property
Private m_x As Integer
Public Property y() As Integer
Get
Return m_y
End Get
Set
m_y = Value
End Set
End Property
Private m_y As Integer
Public Property w() As Integer
Get
Return m_w
End Get
Set
m_w = Value
End Set
End Property
Private m_w As Integer
Public Property h() As Integer
Get
Return m_h
End Get
Set
m_h = Value
End Set
End Property
Private m_h As Integer
End Class
Public Class Stats
Public Property hp() As Double
Get
Return m_hp
End Get
Set
m_hp = Value
End Set
End Property
Private m_hp As Double
Public Property hpperlevel() As Double
Get
Return m_hpperlevel
End Get
Set
m_hpperlevel = Value
End Set
End Property
Private m_hpperlevel As Double
Public Property mp() As Double
Get
Return m_mp
End Get
Set
m_mp = Value
End Set
End Property
Private m_mp As Double
Public Property mpperlevel() As Double
Get
Return m_mpperlevel
End Get
Set
m_mpperlevel = Value
End Set
End Property
Private m_mpperlevel As Double
Public Property movespeed() As Double
Get
Return m_movespeed
End Get
Set
m_movespeed = Value
End Set
End Property
Private m_movespeed As Double
Public Property armor() As Double
Get
Return m_armor
End Get
Set
m_armor = Value
End Set
End Property
Private m_armor As Double
Public Property armorperlevel() As Double
Get
Return m_armorperlevel
End Get
Set
m_armorperlevel = Value
End Set
End Property
Private m_armorperlevel As Double
Public Property spellblock() As Double
Get
Return m_spellblock
End Get
Set
m_spellblock = Value
End Set
End Property
Private m_spellblock As Double
Public Property spellblockperlevel() As Double
Get
Return m_spellblockperlevel
End Get
Set
m_spellblockperlevel = Value
End Set
End Property
Private m_spellblockperlevel As Double
Public Property attackrange() As Double
Get
Return m_attackrange
End Get
Set
m_attackrange = Value
End Set
End Property
Private m_attackrange As Double
Public Property hpregen() As Double
Get
Return m_hpregen
End Get
Set
m_hpregen = Value
End Set
End Property
Private m_hpregen As Double
Public Property hpregenperlevel() As Double
Get
Return m_hpregenperlevel
End Get
Set
m_hpregenperlevel = Value
End Set
End Property
Private m_hpregenperlevel As Double
Public Property mpregen() As Double
Get
Return m_mpregen
End Get
Set
m_mpregen = Value
End Set
End Property
Private m_mpregen As Double
Public Property mpregenperlevel() As Double
Get
Return m_mpregenperlevel
End Get
Set
m_mpregenperlevel = Value
End Set
End Property
Private m_mpregenperlevel As Double
Public Property crit() As Double
Get
Return m_crit
End Get
Set
m_crit = Value
End Set
End Property
Private m_crit As Double
Public Property critperlevel() As Double
Get
Return m_critperlevel
End Get
Set
m_critperlevel = Value
End Set
End Property
Private m_critperlevel As Double
Public Property attackdamage() As Double
Get
Return m_attackdamage
End Get
Set
m_attackdamage = Value
End Set
End Property
Private m_attackdamage As Double
Public Property attackdamageperlevel() As Double
Get
Return m_attackdamageperlevel
End Get
Set
m_attackdamageperlevel = Value
End Set
End Property
Private m_attackdamageperlevel As Double
Public Property attackspeedoffset() As Double
Get
Return m_attackspeedoffset
End Get
Set
m_attackspeedoffset = Value
End Set
End Property
Private m_attackspeedoffset As Double
Public Property attackspeedperlevel() As Double
Get
Return m_attackspeedperlevel
End Get
Set
m_attackspeedperlevel = Value
End Set
End Property
Private m_attackspeedperlevel As Double
End Class
Public Class ChampionName
Public Property version() As String
Get
Return m_version
End Get
Set
m_version = Value
End Set
End Property
Private m_version As String
Public Property id() As String
Get
Return m_id
End Get
Set
m_id = Value
End Set
End Property
Private m_id As String
Public Property key() As String
Get
Return m_key
End Get
Set
m_key = Value
End Set
End Property
Private m_key As String
Public Property name() As String
Get
Return m_name
End Get
Set
m_name = Value
End Set
End Property
Private m_name As String
Public Property title() As String
Get
Return m_title
End Get
Set
m_title = Value
End Set
End Property
Private m_title As String
Public Property blurb() As String
Get
Return m_blurb
End Get
Set
m_blurb = Value
End Set
End Property
Private m_blurb As String
Public Property info() As Info
Get
Return m_info
End Get
Set
m_info = Value
End Set
End Property
Private m_info As Info
Public Property image() As Image
Get
Return m_image
End Get
Set
m_image = Value
End Set
End Property
Private m_image As Image
Public Property tags() As List(Of String)
Get
Return m_tags
End Get
Set
m_tags = Value
End Set
End Property
Private m_tags As List(Of String)
Public Property partype() As String
Get
Return m_partype
End Get
Set
m_partype = Value
End Set
End Property
Private m_partype As String
Public Property stats() As Stats
Get
Return m_stats
End Get
Set
m_stats = Value
End Set
End Property
Private m_stats As Stats
End Class
Public Class RootObject
Public Property ChampionName() As ChampionName
Get
Return m_ChampionName
End Get
Set
m_ChampionName = Value
End Set
End Property
Private m_ChampionName As ChampionName
End Class
我没有得到任何错误,但也不是期望的结果。
以下是输出:
非常感谢您的帮助!从VS2010开始,您的类实际上只需要自动属性;这使它们的编码和阅读更加简单:
Public Class Info
Public Property attack As Integer
Public Property defense As Integer
Public Property magic As Integer
Public Property difficulty As Integer
End Class
... etc
最后一个是根对象
Public Class Players
Public Property Aatrox As Champion
Public Property Ahri As Champion
End Class
这些将用于反序列化数组或列表(玩家)
:
如果您想要阵列,请执行以下操作:
Dim obj = JsonConvert.DeserializeObject(Of Players())(jstr)
无论哪种方式,最终都会得到一个包含1个玩家项目的数组/列表,其中包含Ahri
和Aatrox
属性对象
这个json有点傻,因为外部的
[
强制将结果放入一个数组中。“Aatrox”:{…},“Ahri”:{…}
应该允许您反序列化到一个可以迭代的字典,但是[…]
意味着我们必须将其放入一个数组中:
Dim temp = JsonConvert.DeserializeObject(Of Dictionary(Of String, Player)())(jstr)
' extract the player dictionary:
Dim players As Dictionary(Of String, Player) = temp(0)
For Each kvp As KeyValuePair(Of String, Player) In players
Console.WriteLine("Name: {0} Title: {1}",
kvp.Key, kvp.Value.title)
Next
每个的键将是名称,值将是Player
类对象:
Dim hp = players("Ahri").stats.hp
我的想法是,由于所有对象都具有相同的属性,我可以将json反序列化为一个数组,然后循环遍历它并获取数据(生成的表单:包含ChampionName类。我将尝试您的建议!感谢您的帮助,伙计!您的ChampionName类只是一般的Aatrox和Ahri类版本(现在有意义了)-这就是我最后所说的播放器。是的,我目前正在编写没有任何转换器/生成器的类,并将再次测试它。json包含100多个对象,因此我必须将它们全部添加到RootObject中?我不能只使用一个对象并将对象传递到数组中吗?我认为如果json文件得到更新会更好。不幸的是,我不能这不是JSON的构造方式。即使每个参与者都有相同的属性集,RootObject也会单独指定它们。反序列化的内容/方式取决于它的序列化/编码方式。在执行此操作的过程中,您可以“解包”“将它们添加到列表中。请确保单击此帮助的复选标记以了解如何循环对象?此类的目的是检查每个名称,如果它与从另一个json(已获取该部分)获取的名称相同,则获取图像(或任何其他数据)并从web检索图像。
Dim hp = players("Ahri").stats.hp