解析JSON

JSON的解析,Foxtable采用的是第三方库Newtonsoft.JSON。

Foxtable已经引入了以下两个命名空间:


Newtonsoft.Json
Newtonsoft.Json.Linq

你可以直接在代码中使用
Newtonsoft.JSON进行JSON的系列化和反系列化。

如果已经熟悉了
Newtonsoft.JSON,可以跳过本节内容。

示例一

简单JSON对象的解析和注意事项。

在命令窗口执行:


Dim
json As String = "{'name':'李云龙','age':'36'}"
Dim
jo As JObject = JObject.Parse(json)
Output
.Show(jo("name"))
Output
.Show(jo("age"))

显示的结果是:


李云龙
36

JSON对象成员可以直接转换为相应的数据类型,例如:

Dim json As String = "{'name':'李云龙','age':'36'}"
Dim
jo As JObject = JObject.Parse(json)
Dim
Name As String  = jo("name")
Dim
Age As Integer = jo("age")

但是有一个很奇怪的现象,直接将JSON成员和字符串组合会出错,例如以下代码是无法执行的的:

Dim
json As String = "{'name':'李云龙','age':'36'}"
Dim
jo As JObject = JObject.Parse(json)
Output
.Show("姓名:" & jo("name") & " 年龄:" & jo("age"))

必须改为:

Dim
json As String = "{'name':'李云龙','age':'36'}"
Dim
jo As JObject = JObject.Parse(json)
Output
.Show("姓名:" & jo("name").ToString() & " 年龄:" & jo("age").ToString())

此外JSON对象是区分大小写的,所以上述代码中,如果你改用JO("Name")是取不到值的,只能是jo("name")。

实际上你用JO("Name")取值,并不会出错,而是返回一个空值(Nothing),我们可以用这个特性判断JSON对象是否包括指定名称的成员,例如:

Dim json As String = "{'name':'李云龙','age':'36'}"
Dim
jo As JObject = JObject.Parse(json)
Output
.show( jo("Name") Is Nothing )
Output
.show( jo("Test") Is Nothing )

显示的结果是:

True
True

示例二

解析嵌套对象。

在命令窗口执行:

Dim json As String = "{'name':'李云龙','age':'36','card':{'bank':'工行','account':'123456'}}"
Dim
jo As JObject = JObject.Parse(json)
Output
.Show(jo("name"))
Output
.Show(jo("age"))
Output
.Show(jo("card")("bank"))
Output
.Show(jo("card")("account"))

上面的JSON对象嵌套了一个子对象card,这个子对象有自己的属性(bank和account)。

显示的结果为:

李云龙
36
工行
123456

示例三

JSON值数组的解析。

在命令窗口执行:

Dim json As String = "['张三','李四','王五']"
Dim
ja As JArray = JArray.Parse(json)
For
i As Integer = 0 To ja.Count - 1
    output.show(ja(i))

Next

显示的结果是:

张三
李四
王五

JSON数组 的对象为JArray,数组成员的类型为JToken,所以也可以用下面的代码遍历JSON数组:

Dim json As String = "['张三','李四','王五']"
For
Each v As JToken In JArray.Parse(json)
    Output.show(v)

Next

示例四

JSON对象中的值数组的解析。

在命令窗口执行:

Dim json As String  = "{'touser':['zhansan', 'lisi'],'msgtype':'text'}"
Dim
jo As JObject = JObject.Parse(json)
Dim
ja As JArray = jo("touser")
For
i As Integer = 0 To ja.Count - 1
   Output.Show(ja(i).ToString)

Next

Output
.Show(jo("msgtype").Tostring)

上面的JSON对象中,touser属性是一个值数组,这个数组包括两个成员(zhansan和lisi)。

执行后显示的结果为:

zhansan
lisi
text


同样也可以通过JToken来遍历,得到的结果是一样的:

Dim
json As String  = "{'touser':['zhansan', 'lisi'],'msgtype':'text'}"
Dim
jo As JObject = JObject.Parse(json)
For
Each jt As JToken In jo("touser")
  
Output.Show(jt)
Next

Output
.Show(jo("msgtype").Tostring)

示例五

JSON对象数组的解析。

在命令窗口执行:

Dim json As String = "[{'name':'李云龙','age':'36'},{'name':'黄晓明','age':'28'}]"
Dim
ja As JArray = Jarray.Parse(json)
For
i As Integer = 0 To ja.Count - 1
   
OutPut.Show("姓名:"  & ja(i)("name").ToString() &  "  年龄:" & ja(i)("age").ToString())
Next

或者:

Dim json As String = "[{'name':'李云龙','age':'36'},{'name':'黄晓明','age':'28'}]"
For
Each ep As JToken In JArray.Parse(json)
   
Output.Show("姓名:"  & ep("name").ToString() &  "  年龄:" & ep("age").ToString())
Next


显示的结果为:

姓名:李云龙 年龄:36
姓名:黄晓明 年龄:28

示例六

嵌套的对象数组解析。

在命令窗口执行:

Dim json As String = "{'name':'李云龙','card':[{'bank':'工行','account':'123'},{'bank':'建行','account':'678'}]}"
Dim
jo As JObject = JObject.Parse(json)
Output
.Show(jo("name"))
For
Each jt As JToken In jo("card")
    Output.Show(jt("bank").ToString & "|" & jt("account").ToString)

Next


上面的JSON对象,其card属性是一个对象数组,包括两个银行卡信息。

显示的结果为:

李云龙
工行|123
建行|678


本页地址:http://www.foxtable.com/mobilehelp/topics/0140.htm