VB.net的JSON反序列化

某天在议事厅突然看到一个监视开服的Python脚本,感觉效果不错,虽说我不玩猎人也不做成就用不着盯着服务器开服,不过感觉挺好玩的。

那个Python脚本的原理是解析战网服务器状态那个网页,因此速度比较慢,当时我就觉得如果WOW像CS那样开放个UDP Query什么的就好了,随手搜了一下WOW Realm Status API,居然还真搜到了

试了一下,在国服战网是好使的,因为取得的是JSON数据,所以速度非常快,根据官方API文档,每天每个匿名app可以获取至少3000次数据,差不多30秒一个的样子,为了监视开服的话按照每周维护14小时的尿性估计15秒一次都没问题。这比打开整个服务器状态页面快多了。

虽说JSON的结构很简明,但是你懂的,用VB的都喜欢找现成的函数或者类来完成,自己split很烦,尤其是国服有307个服务器……

搜了一下,在.net Framework 3.5以上,System.Web.Script.Serialization命名空间里有一个JavaScriptSerializer!直接撞枪口上了,真好。

结果一开始我压根就找不到这个命名空间,才发现原来默认的project没有引用System.Web.Extension,所以找不到,需要去自己手动引用一下。

20130227221745

之后有了这个类,就可以把JSON信息反序列化了,我直接定义了一个class来存放这些数据

Public Class ServerStatus
Public Property realms() As Realm()
End Class
Public Class Realm
Public Property type As String
Public Property population As String
Public Property queue As Boolean
Public Property wintergrasp As WG
Public Property tol_barad As TB
Public Property status As Boolean
Public Property name As String
Public Property slug As String
Public Property battlegroup As String
Public Property locale As String
Public Property timezone As String
End Class
Public Class WG
Public Property area As Integer
Public Property controlling_faction As Integer
Public Property status As Integer
Public Property [next] As Long
End Class
Public Class TB
Public Property area As Integer
Public Property controlling_faction As Integer
Public Property status As Integer
Public Property [next] As Long
End Class

只需要很简单的一句gstatus = jss.Deserialize(Of ServerStatus)(gServerStatus)就搞定解析了……(jss是我声明的JavaScriptSerializer)

然后就可以直接从我定义的叫gstatus的这个ServerStatus类里面取得每个服务器的信息,甚至还包括冬拥湖和托尔巴拉德的信息,这在一般的服务器状态页面中是看不到的。

由于这个服务器状态API是通用的,所以支持各种区域服务器的信息获取。

呐,估计一周之内能折腾完……也许吧。

分享到: