注册 登录
编程论坛 VFP论坛

JSON与XML你不懂就OUT,真相是它们都是字符串

加菲猫的VFP 发布于 2021-11-30 09:26, 3608 次点击
JSON和XML这两个东西如果不弄清楚,BS,APP,中间层,小程序,公众号开发这道坎是万万迈不过去的,其实它们都是字符串,不信你接着往下看。

准备环境:
JSON解析:木瓜大侠的FOXJSON库
XML解析:系统一般自带
VFP SP2 7423


框架中自带FOXJSON,就不需要另外下载了。
如果想要这些文件,请关注公众号:加菲猫的VFP,发送“JSON”就可以获取下载链接。

JSON与XML的概念
JSON:
一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。可在不同平台之间进行数据交换。JSON采用兼容性很高的、完全独立于语言文本格式,同时也具备类似于C语言的习惯。
XML:
扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

请记住,他们就是字符串。

键值对表示法
JSON 使用键/值对的字符串来表示数据{键:值}
{"name":"张三","age":"20"}可以表示一个姓名,年龄的信息

XML用标签来表示
张三 20

vfp来创建JSON
1.方法一

cJson=[{"name":"张三","age","20"}]

2.方法二:使用木瓜的foxjson

oUser=Createobject("foxJson")
oUser.Append("name","张三")
oUser.Append("age",20)
?oUser.ToString()

VFP如何解析这个字符串?
cJosn='{"name":"张三","age":"20"} '
oJSON=foxjson_parse(cJson)
?oJson.item("name")
?oJson.item("age")

vfp来创建JSON数组
oUsers=Createobject("foxJson",{})
oUser=Createobject("foxJson")
oUser.Append("name","张三")
oUser.Append("age",20)
oUsers.Append(oUser)
oUser=Createobject("foxJson")
oUser.Append("name","李四")
oUser.Append("age",18)
oUsers.Append(oUser)
?oUser.toString()

VFP解析JSON数组
cJson='[{"name":"张三","age":20},{"name":"李四","age":8}] '
oUsers=foxjson_parse(cJson)
?"记录数",oUsers.count
?oUsers.item(1).item("name")
?oUsers.item(1).item("age")
?oUsers.item(2).item("name")
?oUsers.item(2).item("age")

vfp来创建xml
方式一
cXML=[<preson><name>张三</name><age>20</age></preson>]

方式二

oXMLDOC=Createobject("Microsoft.XMLDOM")
oPerson= oXMLDOC.createElement("person")
oName=oXMLDOC.createElement("name")
oName.Text="张三"
oAge=oXMLDOC.createElement("age")
oAge.Text=20
oPerson.appendchild(oName)
oPerson.appendchild(oAge)
?oPerson.XML

建立一个XML数组
*--建立一个XML数组

oXMLDOC=Createobject("Microsoft.XMLDOM")
oPersons=oXMLDOC.createElement("persons")
&&加个S表示多个
oPerson= oXMLDOC.createElement("person")
oName=oXMLDOC.createElement("name")
oName.Text="张三"
oAge=oXMLDOC.createElement("age")
oAge.Text=20
oPerson.appendchild(oName)
oPerson.appendchild(oAge)
oPersons.appendchild(oPerson)
oPerson= oXMLDOC.createElement("person")
oName=oXMLDOC.createElement("name")
oName.Text="李四"
oAge=oXMLDOC.createElement("age")
oAge.Text=25
oPerson.appendchild(oName)
oPerson.appendchild(oAge)
oPersons.appendchild(oPerson)


VFP解析XML
TEXT TO lcXML NOSHOW TEXTMERGE
张三20
ENDTEXT
oXMLDOC=Createobject("Microsoft.XMLDOM")
oXMLDOC.loadxml(lcXML )
?"共有子标签:",oxmldoc.documentElement.childNodes.length
oxmlHeader=oxmldoc.documentElement.childNodes.Item(0)
&&childNodes里有两个标签 分别是name ,age
?oxmlHeader.text &&里面的值
?oxmlHeader.xml &&连同标签
?oxmlHeader.nodename &&标签名
通过childNodes 一级一级往下
XML 是无限多级的
上级的childNodes 存放下级标签有多少个,分别是什么

只有本站会员才能查看附件,请 登录




xml是一颗倒置的树,如果每一个节点都要输出,那得用编历算法(我研究完就忘记了,递归算法)

只有本站会员才能查看附件,请 登录


oNode=getElementsByTagName("name")

通过xmldoc的getElementsByTagName方法可以将所有同名的标签全部抓出来变成一个集合

使用另一个大招getElementsByTagName
TEXT TO lcXML NOSHOW TEXTMERGE
<preson><name>张三</name><age>20</age></preson>
ENDTEXT
oXMLDOC=Createobject("Microsoft.XMLDOM")
oXMLDOC.loadxml(lcXML )
oXMLHeaders=oXMLDOC.getElementsByTagName("name")
?"标签集合共有",oxmlHeaders.length
?oxmlHeaders.item(0).text &&里面的值
?oxmlHeaders.item(0).xml &&连同标签
?oxmlHeaders.item(0).nodename &&标签名


24 回复
#2
厨师王德榜2021-11-30 09:42
感谢分享.
#3
schtg2021-12-01 06:55
谢谢!
#4
吹水佬2021-12-01 15:21
用系统的 MSScript
程序代码:
sc = CREATEOBJECT("ScriptControl")
sc.Language = "JavaScript"
cJson='var d = [{"name":"张三","age":20},{"name":"李四","age":8}] '
sc.AddCode(cJson)
FOR EACH oj IN sc.CodeObject.d
    ? oj.name,oj.age
ENDFOR
#5
foxfans2021-12-01 15:55
做为服务器后端代码,CreateObject少用少封装,多一层性能大幅下降,吞吐量减少60%以上,如果createobject常驻还好点,不然不断创建释放性能是非常低下,多用原生Dll, Fll库,如果是客户端用可以忽略这些性能损耗.

[此贴子已经被作者于2021-12-1 16:13编辑过]

#6
吹水佬2021-12-01 16:10
以下是引用foxfans在2021-12-1 15:55:55的发言:

做为服务器后端代码,CreateObject,少用少封装,多一层性能大幅下降,吞吐量减少60%以上,如果createobject常驻还好点,不然不断创建释放性能是非常低下,多用原生用dll, fll库.

VFP就这样,尤其是CreateObject对象是外部进程(如EXCEL),涉及到跨进程,想快点也不容易。
对于一般用VFP的自己写DLL扩展有难度,会写DLL的可能也不会用VFP做服务端
#7
foxfans2021-12-01 16:40
回复 6楼 吹水佬
的确用Vfp的越来越少了,VFP充当服务端后端开发非常难得,本身属非编译型语言,想快点也很难. 建议楼主多考虑直接调用外部Fll,Dll来提速,尽量少些中间环节效果会更佳,最没办法的时候才会去考虑com组件.
#8
sam_jiang2021-12-01 19:27
见识了,全是大佬啊。。。
#9
加菲猫的VFP2021-12-02 08:27
回复 7楼 foxfans
快和慢都是相对的,先解决是否可用的问题,再解决好用的问题,再解决速度的问题。
#10
吹水佬2021-12-02 09:30
以下是引用加菲猫的VFP在2021-12-2 08:27:44的发言:

快和慢都是相对的,先解决是否可用的问题,再解决好用的问题,再解决速度的问题。

现实就是这样,能有效地解决实际需要就可以。
如果从系统网络应用层的底层开发,只用VFP代码也可以写出B/S、C/S、F/S应用系统。
肯定没有人会那么“笨”只用VFP代码来写这类应用,因到处随手可得到用在这方面开发的控件、类库和扩展库,轻松省时省力何乐而不为。
#11
foxfans2021-12-02 09:44
从开发者的角度也许没错,对消费者使用者就不这么认为,对客户负责不是这么二句话的,更何况你做的是服务端产品,并非一般的客户端快慢无所谓。等到客户集成到项目中发现瓶颈可能就来不及,客户的投资和运营都可能带来灾难,甚至难于挽回的经济损失,客户用来做什么能不能做,做的效果达到的程度都得有个底,Vfp群友XXXX用上...XXXXXX...,除了学习花几个月,上项目后损失大几万,不信自己打听,至少作者自己得十分清楚这模式今后提速的空间,可能性有多大,是一个人用,几个人用,同时允许容纳支持多少人在线用,任何一款后端都有基线,标准,你懂,客户更应该知情,这些就像食品药品安全报告无法逃避更不能逃避。

[此贴子已经被作者于2021-12-3 17:39编辑过]

#12
厨师王德榜2021-12-02 10:21
回复 10楼 吹水佬
是的,VFP不是有没有这个能力的问题,而是用这个语言来开发B/S这些领域的东西,划不划算的问题?
后期维护成本必须要考虑进来(新招的员工懂不懂VFP?懂到什么程度?)
再者,C#,java,python 这些开发工具,在这方面都有好多现成的库,有现成的东西不用,为什么还要费那个劲?
#13
加菲猫的VFP2021-12-02 10:24
回复 10楼 吹水佬
VFP的开发效率和运行效率完全可以满足中小型应用的需要了。如果你非要拉出淘宝之类的,很遗憾,淘宝不是单一语言,单一架构。
任何商业的系统都是进化而来的。

VFP写的系统也是如此。

很遗憾我就是那个很笨的人。有所谓的控件,扩展,类也都是人做成的。

只不过原来VFP没有人做,现在有人做了,好用了,就足够了。 

#14
加菲猫的VFP2021-12-02 10:29
人为什么要局限于自己的看法呢?有那么多狐友,有着自己软件运行在这个地球上,如果可以很轻松地进入BS的世界,何乐而不为,PHP不也是这样,当年ASP不也是这样。

用VFP开发BS就能给客户带来损失了,这明显就是偷换概念,用其它语言开发BS不会给客户带来损失了吗?

我见过用C#写得像屎一样的代码,还见过许多花费了几十万,几百万的JAVA .NET的系统死了。

我也见过很多VFP写的系统,还在用力的生活着。

另外要以发展的眼光看问题,而不是局限这里快一点,那里快一点。

对于绝大数狐友来说,应用的规模,还达不到需要要算法比拼优化的情况。

对了,JS开发后端也不是被看不起,人家也越发蓬勃成长了起来。大人,时代变了。 用VFP,但不局限于VFP,用VFP混合一切不香吗?

VFP遇到的问题,你换个语言,换个工具就不会遇见了吗?

牛逼的语言,是语言牛逼啊,并不是人牛逼啊。

[此贴子已经被作者于2021-12-2 10:32编辑过]

#15
foxfans2021-12-02 10:43
按你这么说,客户的死活,关产品什么关系,我做的产品再烂收完钱,出了事也不管我的事,人吃了食品中毒关厂家什么关系。这是什么逻辑,你做的是服务端产品,并非玩具。也别小瞧中小企业的应用,一些需求并发要求完全颠覆你的想像.

[此贴子已经被作者于2021-12-3 17:55编辑过]

#16
sostemp2021-12-02 10:48
以下是引用加菲猫的VFP在2021-12-2 10:29:51的发言:

人为什么要局限于自己的看法呢?有那么多狐友,有着自己软件运行在这个地球上,如果可以很轻松地进入BS的世界,何乐而不为,PHP不也是这样,当年ASP不也是这样。

用VFP开发BS就能给客户带来损失了,这明显就是偷换概念,用其它语言开发BS不会给客户带来损失了吗?

我见过用C#写得像屎一样的代码,还见过许多花费了几十万,几百万的JAVA .NET的系统死了。

我也见过很多VFP写的系统,还在用力的生活着。

另外要以发展的眼光看问题,而不是局限这里快一点,那里快一点。

对于绝大数狐友来说,应用的规模,还达不到需要要算法比拼优化的情况。

对了,JS开发后端也不是被看不起,人家也越发蓬勃成长了起来。大人,时代变了。 用VFP,但不局限于VFP,用VFP混合一切不香吗?

VFP遇到的问题,你换个语言,换个工具就不会遇见了吗?

牛逼的语言,是语言牛逼啊,并不是人牛逼啊。



也许有点不中听,希望楼主不要介意:
建议楼主您甭发这种无意义的贴了,把发贴机会留给那些需要解决问题的友友们。

您技术高,可以帮助论坛中提出问题发贴的友友们,去帮友友们解决问题。

支持论坛中这些敬爱的版主们,他们才是真正去解决友友们提出的问题,大家也同时可以学习解决问题的能力。
#17
吹水佬2021-12-02 10:51
以下是引用加菲猫的VFP在2021-12-2 10:24:28的发言:
很遗憾我就是那个很笨的人。

提到的这个“笨”看如何理解。
如果只是windows+vfp,没有第三方的所谓控件、类库、扩展库、脚本等,写出BS、CS等实际应用,这个“笨”肯定会变得聪明得多,到那时就是手中无VFP心中有VFP了,不管用什么语言、什么平台都一样挥洒自如。

#18
加菲猫的VFP2021-12-02 11:06
回复 16楼 sostemp
难道我发的东西不是解决实际的问题吗?
#19
加菲猫的VFP2021-12-02 11:09
回复 15楼 foxfans
首先要说明的是:辨论请在同一议题下,
这是你的原文:
按你这么说,客户的死活,关产品什么关系,我做的产品再烂收完钱,出了事也不管我的事,人吃了食品中毒关厂家什么关系。这是什么逻辑,你做的是产品,并非玩具。

第一:你哪句话看出我说过客户的死活,是由产品引发的?
第二:你哪句话看出了事不管我的事?
第三:你哪句话看我说了,人吃了食品中毒关厂家什么关系?

搞技术的人有点逻辑感好不?

连辨论的论点都不知道哪里?那是不是先去学习一下找论点,然后找论据。
#20
加菲猫的VFP2021-12-02 11:12
回复 17楼 吹水佬
感谢版主的肯定。

我只做了一点微小的工作,理解我的人也很多,因为有他们,我也做出VFP界的第一个社群。

不理解我的人也很多,说我掉进了钱眼里面。哈哈哈。

看怎么理解, 免费是人情,收费是本份, 凭劳动所得,堂堂正正。
#21
foxfans2021-12-02 11:13
不和你辩解,你永远是对的,你的产品永远是无敌的,我看到的不是做产品而做产品,而是为了广告罢了,这里谁不会微信开发,也没几个这般口气这般高调。 看你这标题:JSON与XML你不懂就OUT,真相是它们都是字符串 狐友们,万万不可掉队,VFP开发企业微信第一关回调该怎么配? …………。原来是为了做广告。我错了,你继续介绍产品。不过这种贴子标题建议在个人博客,空间,网页,公众号…………为佳。
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2021-12-2 11:27编辑过]

#22
加菲猫的VFP2021-12-02 11:25
电影中《师父》,廖凡说:招式我展示出来了,能吸收多少全看缘份。

有些地方看不懂,自然是某些知识还没有准备倒位,有些东西,即使不用我框架也是可以做到的,我也有提XMLHTTP,我也有讲加解密的FLL哪里下载。

这些干货你看不懂啊,还是看不见呢?那是为什么呢?可以细究一下。

[此贴子已经被作者于2021-12-2 11:43编辑过]

#23
sostemp2021-12-02 15:49
回复 21楼 foxfans
#24
xuminxz2021-12-02 16:43
楼主说的很对,收费是正常的。用户想少交费甚至免费的心情也可以理解。正因为这样,一般公司客户喜欢用流行语言开发的产品,这样能作后期功能的扩展人就更多,维护成本就可以下来。
#25
kosung2021-12-03 11:31
百花齐放,百家争鸣,各有各的价值。识不识货是个人认识问题,值不值这个价是市场说了算。共享是美好的,但共享不是一切,产品的价值最终以金钱来衡量。能认识清楚是关键,知识也是有价值的。
1