解析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