分享一个狐表的表row与json格式互转的细节问题

发表日期: 2021-12-07

0.简介

来自newtonsoft公司的开源组件

官方技术手册:https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JProperty.htm#!

1.Json框架解释

当你不知道里面包含什么时,可以这样遍历判断

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#!

  1. JToken:抽象基类,最强大佬。可用于表示并存放各种JSON结果,包括JObject、JArray、JProperty、JValue。

  2. JObject:用于操作JSON对象。既可使用parse方法通过现有的字符串解析生成,也可通过new关键字创建。不能被遍历解析,请转给JToken

  3. JArray:用于操作JSON数组。既可使用parse方法通过现有的字符串解析生成,也可通过new关键字创建。能够被遍历解析。

  4. JProperty:用于操作对象属性,多用于对象遍历:name返回键名,value返回键值,返回的都是对象,如果需要加工处理,需要ToString

  5. JValue:用于操作数组原生值,多用于数组遍历,返回的都是对象,如果需要加工处理,需要ToString;

2.狐表的DataRow→json

2.1常见的4种类型转换

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"等预定义格式

2.2全部转换函数

常用函数名作用
CStr()转换为String字符串
CDate()转换为Date类型
CBool()转换为Boolean类型
Val()转换为一个合适的数字类型


少用函数名作用
CInt()转换为整数(Integer)
CShort()换为短整数(Short)
Cbyte()转换为微整数(Byte)
CLng()转换为长整数(Long)
CSng()转换为单精度小数(Single)
CDbl()转换为双精度小数(Double)
CDec()转换为高精度小数(Decimal)

3.json→狐表

3.1转成DataRow

所有行可以可以通过ToString赋值,狐表自动转换。当然原来的json对象类型要与row类型匹配

r("某种类型的字段")= jo("相应类型的字段").ToString

3.2转成.net使用

如果用作vb运算,则需要专门转换

If CStr(jo("商品名称")) <> "" Then
If CBool(jo("是否生效")) = True Then
If Val(jo("库存数量")) >0 Then
If CDate(jo("出生日期")) > #1992-2-2# Then

3.3CStr与ToString语法区别

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



随便看看

Copyright © 2016-2022 江门蓬江区华越科技公司 版权所有 | 承接软件定制开发,欢迎联系
粤ICP备17073215号