JSON反序列化到VB.Net对象

时间:2017-01-15 16:47:56

标签: json vb.net deserialization

我已经阅读了其他答案,但我似乎仍然迷失了。我试图将JSON带入我的对象。我通过API调用JSON字符串,我想在RequestManager之后将其转换为对象。我错过了什么方法吗?此外,returnChampions2函数是错误的。我在方法之后发布了部分JSON字符串,它真的很长。

公共类RequestManager

Public Function returnChampions2(ByVal strRegion As String) As LeagueChampionMaster
    Dim strRequest As String = "https://global.api.pvp.net/api/lol/static-data/" + strRegion + "/v1.2/champion?api_key=" + _APIKey
    Return JsonConvert.DeserializeObject(Of LeagueChampionMaster)(returnJSONRequest(strRequest))
End Function

Public Class LeagueChampionMaster
    Private _Type As String
    Private _Version As String
    Private _Data As LeagueChampion()
End Class

Public Class LeagueChampion
    Private _ID As Integer
    Private _Key As String
    Private _Name As String
    Private _Title As String
End Class

json:

  

{ “类型”: “冠军”, “版本”: “6.24.1”, “数据”:{ “贾克斯”:{ “ID”:24, “关键”: “贾克斯”, “姓名”: “贾克斯”,“称号”:“大宗师   at Arms“},”Sona“:{”id“:37,”key“:”Sona“,”name“:”Sona“,”title“:”Maven of   该   琴弦 “},” TRISTANA “:{” ID “:18,” 钥匙 “:” TRISTANA “ ”名“: ”TRISTANA“, ”称号“:” 在   Yordle   炮手 “},” 内翻 “:{” ID “:110,” 钥匙 “:” 内翻 “ ”名“: ”内翻“, ”称号“:” 在   箭头   惩戒 “},” Fiora的 “:{” ID “:114,” 钥匙 “:” Fiora的 “ ”名“: ”Fiora的“, ”称号“:” 在   盛大   决斗者 “},” 烧焦 “:{” ID “:27,” 钥匙 “:” 烧焦 “ ”名“: ”烧焦“, ”称号“:” 在   疯狂化学家“},”TahmKench“:{”id“:223,”key“:”TahmKench“,”name“:”Tahm   Kench“,”标题“:”河   王 “},” 勒布朗 “:{” ID “:7,” 关键 “:” 勒布朗 “ ”名“: ”勒布朗“, ”称号“:” 在   骗子 “},” THRESH “:{” ID “:412,” 钥匙 “:” 脱粒 “ ”名“: ”脱粒“, ”称号“:” 在   链   监狱长 “},” 因果报应 “:{” ID “:43,” 钥匙 “:” 因果报应 “ ”名“: ”因果报应“, ”称号“:” 在   开明   一个 “},” Jhin “:{” ID “:202,” 钥匙 “:” Jhin “ ”名“: ”Jhin“, ”称号“:” 在   炫技 “},” 轰隆隆 “:{” ID “:68,” 钥匙 “:” 轰隆隆 “ ”名“: ”轰隆隆“, ”称号“:” 在   机械化   威胁 “},” Udyr “:{” ID “:77,” 钥匙 “:” Udyr “ ”名“: ”Udyr“, ”称号“:” 在   Spirit Walker“},”LeeSin“:{”id“:64,”key“:”LeeSin“,”name“:”Lee   罪“,”标题“:”盲人   僧 “},” 约里克 “:{” ID “:83,” 钥匙 “:” 约里克 “ ”名“: ”约里克“, ”称号“:” 牧羊人   的   灵魂 “},” Kassadin “:{” ID “:38,” 钥匙 “:” Kassadin “ ”名“: ”Kassadin“, ”称号“:” 在   空虚   沃克 “},” Sivir “:{” ID “:15,” 钥匙 “:” Sivir “ ”名“: ”Sivir“, ”称号“:” 在   战斗   女主人 “},” MissFortune “:{” ID “:21,” 钥匙 “:” MissFortune “ ”名“:” 小姐   财富“,”标题“:”赏金   猎人 “},” Draven “:{” ID “:119,” 钥匙 “:” Draven “ ”名“: ”Draven“, ”称号“:” 在   辉煌   刽子手 “},” 康夫 “:{” ID “:157,” 钥匙 “:” 康夫 “ ”名“: ”康夫“, ”称号“:” 在   不可饶恕 “},” 凯尔 “:{” ID “:10,” 钥匙 “:” 凯尔 “ ”名“: ”凯尔“, ”称号“:” 其   执法官 “},” Shaco “:{” ID “:35,” 钥匙 “:” Shaco “ ”名“: ”Shaco“, ”称号“:” 在   恶魔   小丑 “},” Renekton “:{” ID “:58,” 钥匙 “:” Renekton “ ”名“: ”Renekton“, ”称号“:” 在   屠夫的   金沙 “},” Hecarim “:{” ID “:120,” 钥匙 “:” Hecarim “ ”名“: ”Hecarim“, ”称号“:” 在   影子   战争“},”Fizz“:{”id“:105,”key“:”Fizz“,”name“:”Fizz“,”title“:”潮汐   骗子“}}}

1 个答案:

答案 0 :(得分:2)

你有几个问题。您应该知道,如果将json复制到剪贴板,编辑 - > 选择性粘贴 - > 将Json粘贴为类 Visual Studio将为您创建类,为您提供一个不错的起点。在这个的情况下,该工具有点密集,将为#34; Fizz"," Shaco"创建无数相同的类。你已经规范了那个。

但是,使用所有属性Private,您将无法访问数据。然后,属性名称是错误的。 idkey的json密钥不会映射/反序列化为_id_key,因为它们不匹配。最后,数据收集应该是Dictionary。每个玩家/冠军/项目的关键字将用作Dictionary键:

Public Class LeagueContainer
    Public Property type As String
    Public Property version As String
    Public Property data As Dictionary(Of String, DataItem)
End Class

Public Class DataItem
    Public Property id As Integer
    Public Property key As String
    Public Property name As String
    Public Property title As String
End Class

用法:

Dim jstr = ... from where ever ...
Dim myData = JsonConvert.DeserializeObject(Of LeagueContainer)(jstr)

' print the keys
For Each kvp In myData.data
    Console.WriteLine(kvp.Key)
Next

' what is Yorick's title?
Console.WriteLine("Yorick is '{0}'", myData.data("Yorick").title)

(部分)输出:

  

贾克斯
  索娜
  TRISTANA
  瓦鲁斯
  Fiora的
  ...
  约里克是灵魂的牧羊人'