来自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# Then
CStr和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