| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 513 人关注过本帖
标题:一个 jsondata 挑战去解析
取消只看楼主 加入收藏
iswith
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:493
专家分:645
注 册:2013-5-14
结帖率:2.99%
收藏
 问题点数:20 回复次数:4 
一个 jsondata 挑战去解析
最近得到一个回报文,发现VFP原生确很难解析。。。。
jsondata.txt (101.91 KB)


搜索更多相关主题的帖子: 解析 挑战 报文 VFP 
6 天前 15:47
iswith
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:493
专家分:645
注 册:2013-5-14
收藏
得分:0 
这段解析反序化时,现有的VFP原生基本都失效,可见VFP原生json解析反序化时是存在狭义性的!有时间搞个cOM对象json给VFP使用就好了。。。。
6 天前 22:48
iswith
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:493
专家分:645
注 册:2013-5-14
收藏
得分:0 
。。。。。。。。。

[此贴子已经被作者于2024-12-31 09:33编辑过]

5 天前 09:31
iswith
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:493
专家分:645
注 册:2013-5-14
收藏
得分:0 
以下是引用easyppt在2024-12-30 21:06:28的发言:

很普通的json字符串啊,不知道你解析哪个节点 有问题
这个json字符串是 金蝶 返回来的? 看到formid,怎么觉得那么眼熟

金蝶一张单据,会关联十几个子表,才会得到完整的数据


上贴乱了哈。
没有想的那么复杂,玩VFP喜欢把很多问题想得太复杂,这是原生C扩展出VFP所带来的逻辑,现在都不这么玩了,发给你参考一下。。。。。?


?"2.单据查询 - 销售订单(SAL_SaleOrder): SAL_SaleOrder 待装入实体数据->"
m.lcErrorMsg      = ""                    &&@地址回参
m.lcFormId          = "SAL_SaleOrder"        &&销售订单(SAL_SaleOrder)
m.lcOperateStyle = "ExecuteBillQuery"     &&单据查询  区分大小写

*-- 建表 T_SAL_OUTSTOCK
Create Cursor SAL_SaleOrder( FDate                    C(26);            &&    日期
                            ,FBillNo                C(60);            &&    单据编号
                            ,FCustId_FNumber        C(60);            &&    客户
                            ,FSalerId_FName            C(200);            &&    客户名称
                            ,FQty                    N(13,10);        &&    数量            
                            ,FPrice                    N(13,10);        &&    单价
                            ,FAmount                N(13,10);        &&    金额
                            ,FSettleCurrId_FName    C(60);            &&    结算币别名称
                            ,FMaterialId_FNumber    C(60);            &&  物料编码   
                           )
*--获取对应表字段序列
Local lcFieNoLsts    ;
    , lcFieNo        ;
    , lnCount     
For m.lnCount = 1 To Fcount( "SAL_SaleOrder" )
    m.lcFieNo = Field( m.lnCount )
    m.lcFieNo = Strtran( m.lcFieNo , "_" , "." )
    m.lcFieNoLsts = Iif( Empty( m.lcFieNoLsts ) , "" , m.lcFieNoLsts + "," ) + m.lcFieNo
Endfor

*--构造JsonString 说明:
*    FormId            String    必录            SAL_OUTSTOCK    业务对象表单Id(必录)
*    FieldKeys        String    必录            需查询的字段key集合,字符串类型,格式:"key1,key2,..."(必录) 注(查询单据体内码,需加单据体Key和下划线,如:FEntryKey_FEntryId)
*    FilterString    Array    非必录            []    过滤条件,数组类型,如:[{"Left":"(","FieldName":"Field1","Compare":"67","Value":"111","Right":")","Logic":"0"},{"Left":"(","FieldName":"Field2","Compare":"67","Value":"222","Right":")","Logic":"0"}]
*    OrderString        String    非必录            排序字段,字符串类型(非必录)
*    TopRowCount        Integer    非必录    0        返回总行数,整型(非必录)
*    StartRow        Integer    非必录    0        开始行索引,整型(非必录)
*    Limit            Integer    非必录    2000    最大行数,整型,不能超过10000(非必录)
*    SubSystemId        String    非必录            表单所在的子系统内码,字符串类型(非必录)
Text To m.lcJsonData Textmerge Noshow Pretext 1+2+4+8
        {
            FieldKeys:"<<m.lcFieNoLsts>>",
            FilterString:"FDate >= '2024-12-30'",
            FormId:"<<m.lcFormId>>",
            Limit:100000,
            OrderString:"FBillNo",
            StartRow:0,
            SubSystemId:"",
            TopRowCount:0
        }
Endtext

*-- SendBody 是通用方法
m.lcResult = oKDApi.SendBody( m.lcOperateStyle ,m.lcFormId , m.lcJsonData , @lcErrorMsg )

If !Empty( m.lcErrorMsg  ) Then
   *-- 系统性逻辑错误
   ?m.lcErrorMsg
Else
    *-- 出错信息
    If "Errors" $ m.lcResult Then
        ?m.lcResult
        Return
    Else
        *-- 2.1    解析为表
        *-- 2.2    将oJson数据插入Cursor
        *-- 2.3 需要判定是否获取到了指定条件的全部记录
        
        ? "        2.1 反序化SaleOrder报文:"
        Local loJsonSAL_SaleOrder
        m.loJsonSAL_SaleOrder = oJson.decode( m.lcResult )
        If  !Empty( oJson.cError ) Then
            ?? "失败,原因:" + oJson.cError
            Return
        Else
            ?? "成功"
        Endif
        
        ?"        2.2 解析为表:"
        Local loError
        Try
            For m.lnCount = 1 To m.loJsonSAL_SaleOrder .nsize
               Insert Into SAL_SaleOrder From Array  m.loJsonSAL_SaleOrder.Array[m.lnCount].Array
            Endfor
        Catch To loError
        Endtry
        If Type( "loError.Message" ) == "C"  Then
           ??  "失败,原因:" + m.loError.Message
        Else
           ??  "成功"
        Endif
        Browse
    Endif
Endif
5 天前 09:33
iswith
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:493
专家分:645
注 册:2013-5-14
收藏
得分:0 
有道理,不过你把问题想的太复杂了!就几个表几个字段,需要什么,多简单的事情!有个金蝶服务分分搞定的事情。我现在是MS,Google,忠实客户群体,每个月所交费用也不低!有个服务就是好啊,正版与盗版之间其实技术那点事情一点就破!正版无非就是有个服务,出问题有人帮你解决而以,所以服务很重要,技术架框也就是那么回事。

[此贴子已经被作者于2024-12-31 11:58编辑过]

5 天前 11:53
快速回复:一个 jsondata 挑战去解析
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018100 second(s), 10 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved