来自newtonsoft公司的开源组件
官方技术手册:https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JProperty.htm#!


当你不知道里面包含什么时,可以这样遍历判断
Dim str As String = "['abc',123,0.01,null,'2020-04-13 15:30',true,false,[1,2,'cc',false],{'name':'李云龙','age':36}]"
Dim ja As jarray = jarray.parse(str) '将字符串解析为数组对象
Dim sb As new StringBuilder
For Each jt As JToken In ja '对数组遍历时,每个数组元素的基类是JToken
'根据JToken类型进行判断
'1如果是对象
If jt.Type.ToString() = "Object" Then
sb.AppendLine("Object类型:")
For Each jp As JProperty In jt
sb.Append(" " & jp.Name.ToString & ":")
sb.AppendLine(jp.Value.ToString )
Next
'2如果是对象
Else If jt.Type.ToString() = "Array" Then
sb.AppendLine("Array类型:")
For Each jv As JValue In jt
sb.AppendLine(" " & jv.ToString )
Next
Else
'3如果是原生值
sb.Append(jt.Type.ToString() & "类型:" )
sb.AppendLine(jt.ToString())
End If
Next
Output.Show(sb.ToString)输入结果:
String类型:abc Integer类型:123 Float类型:0.01 Null类型: String类型:2020-04-13 15:30 Boolean类型:True Boolean类型:False Array类型: 1 2 cc False Object类型: name:李云龙 age:36
由此可见,JToken是一个基类,它不仅可以用来表示JObject(json对象),也可以表示JArray(json数组)、JProperty(json属性)和JValue(json原生值)
当无法确定客户端返回的json字符串类型时,都可使用JToken来表示,然后再根据JToken的type属性值来判断其究竟是哪种类型,最后再给出相应的处理方案。类型有String、Integer、Float、Null、Boolean、Array、Object
(所有类型参考官方手册:https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JTokenType.htm#!)
JToken:抽象基类,最强大佬。可用于表示并存放各种JSON结果,包括JObject、JArray、JProperty、JValue。
JObject:用于操作JSON对象。既可使用parse方法通过现有的字符串解析生成,也可通过new关键字创建。不能被遍历解析,请转给JToken
JArray:用于操作JSON数组。既可使用parse方法通过现有的字符串解析生成,也可通过new关键字创建。能够被遍历解析。
JProperty:用于操作对象属性,多用于对象遍历:name返回键名,value返回键值,返回的都是对象,如果需要加工处理,需要ToString
JValue:用于操作数组原生值,多用于数组遍历,返回的都是对象,如果需要加工处理,需要ToString;
Dim jo As new JObject
jo("字符串") = CStr(r("商品名称"))
jo("布尔值") = CBool(r("是否生效"))
jo("数字") = Val(r("商品数量"))
jo("日期") = IIf(r.IsNull("生日日期"),"",Format(r("生日日期"),"yyyy-MM-dd HH:mm:ss"))注意的坑:同步和异步下日期格式会不同。异步会变成yyyy/MM/dd,浏览器会解析错,必须明确格式化,千万别写个"G"等预定义格式
| 常用函数名 | 作用 |
| CStr() | 转换为String字符串 |
| CDate() | 转换为Date类型 |
| CBool() | 转换为Boolean类型 |
| Val() | 转换为一个合适的数字类型 |
| 少用函数名 | 作用 |
| CInt() | 转换为整数(Integer) |
| CShort() | 换为短整数(Short) |
| Cbyte() | 转换为微整数(Byte) |
| CLng() | 转换为长整数(Long) |
| CSng() | 转换为单精度小数(Single) |
| CDbl() | 转换为双精度小数(Double) |
| CDec() | 转换为高精度小数(Decimal) |
所有行可以可以通过ToString赋值,狐表自动转换。当然原来的json对象类型要与row类型匹配
r("某种类型的字段")= jo("相应类型的字段").ToString如果用作vb运算,则需要专门转换
If CStr(jo("商品名称")) <> "" Then
If CBool(jo("是否生效")) = True Then
If Val(jo("库存数量")) >0 Then
If CDate(jo("出生日期")) > #1992-2-2# ThenCStr和ToString的区别,前者不会报错,后者用在不存在变量时会报错。
由于前者会把空引用的报错吃掉,所以要看情况利用,否则出bug很难找到原因
例如:在前端网页里增加了查询条件,但是有的用户可能浏览器有缓存,提交过来的查询条件不一定有新参数,用CStr可以很好规避报错,用ToString会导致有缓存的用户暂时无法查询出东西,要Ctrl+F5强制刷新浏览器缓存,对用户体验不好。
Dim jo As new JObject
jo("商品名称") = "苹果"
If CStr(jo("商品名称11")) ="123" Then
Output.Show(1) '不报错
End If
If jo("商品名称11").ToString ="123" Then
Output.Show(1) '报错
End If