Foxtable(狐表)用户栏目专家坐堂 → 顺丰接口的问题


  共有9168人关注过本帖树形打印复制链接

主题:顺丰接口的问题

帅哥哟,离线,有人找我吗?
有点蓝
  21楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107783 积分:548260 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/3/14 9:54:00 [只看该作者]

Dim json As String = "{'name':'李云龙','age':'36','card':{'bank':'工行','account':'123456'},'aa':['a','b']}"
Dim jo As JObject = JObject.Parse(json)
For Each it As object In jo
    If typeof(it.value) Is JObject
        Dim jo2 As JObject = it.value
        For Each it2 As object In jo2
            Output.Show(it2.key & "-" & it2.value)
        Next
    ElseIf typeof(it.value) Is jarray
        For Each it2 As object In it.value
            Output.Show(it2)
        Next
    Else
        Output.Show(it.key & "-" & it.value)
    End If
Next

 回到顶部
帅哥哟,离线,有人找我吗?
rjh4078
  22楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐精 帖子:3358 积分:24758 威望:0 精华:0 注册:2012/3/26 21:47:00
  发帖心情 Post By:2022/3/14 10:29:00 [只看该作者]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:jsontest.txt


感谢蓝版  这个json还是真有点绕 比如我使用下列代码, 我想使用Dim jo22 As  JObject = JObject.Parse(jo("apiResultData")("waybillNoInfoList")) 或者 Dim jo22 As  JObject = JObject.Parse(jo("apiResultData")("routeLabelInfo"))
获取routeLabelInfo和waybillNoInfoList下的信息,但是又进不去,这个又不是子节点的概念了吗?
Dim dlg As New OpenFileDialog '定义一个新的OpenFileDialog
If dlg.ShowDialog = DialogResult.Ok Then '如果用户单击了确定按钮
    Dim bw As String = FileSys.ReadAllText(dlg.FileName,Encoding.UTF8)
    Dim jo As JObject = JObject.Parse(bw)
    Dim jo22 As  JObject = JObject.Parse(jo("apiResultData"))
    For Each it As object In jo22
        If typeof(it.value) Is JObject
            Dim jo2 As JObject = it.value
            For Each it2 As object In jo2
                Output.Show(it2.key & "-" & it2.value.tostring)
            Next
            
        ElseIf typeof(it.value) Is jarray
            For Each it2 As object In it.value
                Output.Show(it2.Tostring)
            Next
        Else
            Output.Show(it.key & "-" & it.value.Tostring)
        End If
    Next
    
    
End If

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  23楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107783 积分:548260 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/3/14 11:32:00 [只看该作者]

这种属于json里面嵌套使用json字符串。

jo("apiResultData")里面存储的是一个json字符串,而不是对象,所以需要二次使用JObject.Parse解析,二次解析之后就可以直接使用,不存在三次,四次的解析。

上面的代码是没有问题的,问题在于json里面的数据有多层嵌套,自己做个递归处理吧。上面的代码只处理了2层

 回到顶部
帅哥哟,离线,有人找我吗?
rjh4078
  24楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐精 帖子:3358 积分:24758 威望:0 精华:0 注册:2012/3/26 21:47:00
  发帖心情 Post By:2022/3/14 12:35:00 [只看该作者]

蓝版 ,想了个笨办法 直接做个表把字段写进去,但是现在循环解析的时候还是没搞定层层解析的问题
比如
Dim dlg As New OpenFileDialog '定义一个新的OpenFileDialog
If dlg.ShowDialog = DialogResult.Ok Then '如果用户单击了确定按钮
    Dim bw As String = FileSys.ReadAllText(dlg.FileName,Encoding.UTF8)
    Dim jo As JObject = JObject.Parse(bw)
    Dim jo2 As  JObject = JObject.Parse(jo("apiResultData"))    
    output.show((jo2("msgData").Tostring))    
     Dim jo3 As  JObject = JObject.Parse(jo2("msgData")("routeLabelInfo")) '' 或者使用 Dim jo3 As  JObject = JObject.Parse(jo2("msgData"))定义jo3为msgData里的routeLabelInfo节点 到这里就开始报错了
    
End If

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:jsontest.txt



 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  25楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107783 积分:548260 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/3/14 13:51:00 [只看该作者]

都说了不存在三次,四次的解析。jo2里面的所有内容都是正常的json对象,而不是json字符串,

    Dim jo2 As  JObject = JObject.Parse(jo("apiResultData"))    
    output.show((jo2("msgData")("routeLabelInfo")(0)("routeLabelData")("waybillNo").tostring))   

网上有大把的json数据格式化工具 ,自己学会把数据提取出来分析。比如使用vscode,原始文件的json数据格式化后是这样的,明显看得出来apiResultData的内容是一段字符串,而不是对象

此主题相关图片如下:1.png
按此在新窗口浏览图片

apiResultData的内容复制到一个新的文件里,然后把斜杆去掉,重新格式化,可以看出来第二次解析的json对象层次了

此主题相关图片如下:2.png
按此在新窗口浏览图片

[此贴子已经被作者于2022/3/14 13:52:38编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
km007
  26楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:446 积分:5372 威望:0 精华:0 注册:2016/1/28 2:59:00
  发帖心情 Post By:2022/7/25 2:00:00 [只看该作者]

您好!请问您有电子面单吗?

 回到顶部
帅哥哟,离线,有人找我吗?
流水
  27楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:265 积分:2936 威望:0 精华:0 注册:2019/7/19 15:14:00
  发帖心情 Post By:2023/1/17 15:15:00 [只看该作者]

抄了 蓝版 的代码,看不懂,折腾了两天,一点一点倒腾出查询快递的方式(路由查询)

Dim kd As String = CurrentTable.Current("快递单号") '快递单号
Dim sj As String = "1223" '手机后四位

'拼接JOSN文本
Dim bw As String = "{'language':'zh-CN','trackingType':1,'trackingNumber':[ '" & kd & "'],'methodType': 1,'checkPhoneNo':'" & sj & "'}"
Dim jo As JObject = JObject.Parse(bw) '解析JOSN

Dim hc As New HttpClient("https://bspgw.sf-express.com/std/service") '定义一个客户端类,区分生产和沙盒
hc.C '请求头以UTF8的编码方式,这个位置的代码上传就没有,可以去找蓝版的源码复制过来;
Dim xml As String = CompressJson(JObject.Parse(bw)) '压缩JSON,业务报文
Dim ts As String = CLng((Date.Now - New Date(1970, 1, 1)).TotalSeconds) '时间戳_将时段转换为为秒的数值,并将秒数转换为长整数
Dim checkword = "自己的客户校验码" '客户校验码,区分生产和沙盒

'清除可能存在的错误字符,空格或加号
Dim builder As New StringBuilder() '新的大规模合并字符串
For Each c As Char In xml & ts & checkword '单个字符遍历字符串
    If System.Web.HttpUtility.UrlEncode(c.ToString()).Length > 1 Then '判断字符串
        builder.Append(System.Web.HttpUtility.UrlEncode(c.ToString()).ToUpper()) '清除字符串多余字符
    Else
        builder.Append(c) '直接合并
    End If
Next

'将报文MD5加密并通过BASE64生成数字签名
Dim encode As String = Convert.ToBase64String(New System.Security.Cryptography.MD5CryptoServiceProvider().ComputeHash(Encoding.UTF8.GetBytes(builder.ToString()))) 

hc.FormData.Add("partnerID", "自己的客户编码") '客户编码
hc.FormData.Add("requestID", Guid.NewGuid().ToString()) 'UUID码
hc.FormData.Add("serviceCode", "EXP_RECE_SEARCH_ROUTES") '接口服务代码
hc.FormData.Add("timestamp", ts) '时间戳
hc.FormData.Add("msgDigest", encode) '加密的信息
hc.FormData.Add("msgData", xml) '报文信息
Dim ret As String = hc.GetData() '服务器返回的数据

'顺丰返回的格式不会遍历,一层一层的转
jo = JObject.Parse(ret) '解析对象
bw = jo("apiResultData") '返回文本
jo = JObject.Parse(bw) '解析对象
Dim ja As JArray = jo("msgData")("routeResps") '数组
jo = ja(0) '对象

If jo("routes") IsNot Nothing Then
    For Each jt As JToken In jo("routes")
        Output.Show(jt("acceptAddress").ToString & " | " & jt("acceptTime").ToString & " | " & jt("remark").ToString)
    Next
End If
[此贴子已经被作者于2023/1/17 15:17:34编辑过]

 回到顶部
总数 27 上一页 1 2 3