注册 登录
编程论坛 VFP论坛

调用JS脚本,提示 JSON未定义 怎么解决,JS不是很懂。

easyppt 发布于 2023-07-10 15:17, 1690 次点击
下面的代码提示:JSON未定义,

oScript = Createobject("ScriptControl")
oScript.Language = "javaScript"
oScript.AddCode('function fun1(jsonString){var obj = JSON.parse(jsonString);}')
? oScript.Run("fun1", '{"name":"Roob", "type":"CCC"}')
22 回复
#2
吹水佬2023-07-10 16:30
ScriptControl 不是JS解析器
#3
yiyanxiyin2023-07-11 11:39
https://cdn. 下载下来
oScript.AddCode(("D:\\yourapp\\json3.min.js"));
然后再调用JSON.parse()
#4
吹水佬2023-07-11 11:55
以下是引用yiyanxiyin在2023-7-11 11:39:10的发言:

oScript.AddCode(("D:\\yourapp\\json3.min.js"));

不是vfp语句吧
#5
yiyanxiyin2023-07-11 13:47
不好意思, 用vfp读取文本文件的方法把js文件内容读出来放字符串变量里面, 然后addcode(字符串变量)

[此贴子已经被作者于2023-7-11 13:48编辑过]

#6
easyppt2023-07-11 14:32
AddCode()  字符串长度有限吗,我读入一个 1M左右的 json字符串好像被截断了
#7
iswith2023-07-11 14:40
首先VFP是不可能去解析JS运行的!像这类情况应该使用WebView2来完成你的操作,如果不涉及前端的话,你直接对译用VFP的json来解析!
#8
easyppt2023-07-11 15:02
以下是引用yiyanxiyin在2023-7-11 11:39:10的发言:

https://cdn. 下载下来
oScript.AddCode(("D:\\yourapp\\json3.min.js"));
然后再调用JSON.parse()


刚刚测试 有效,谢谢!

另外问一下 如何判断 某个key 是否为数组?
Array.isArray(obj),提示js 代码无效,可能如 吹版说的,ScriptControl 不是 js,
或者 有没有对应的 js脚本 可以 AddCode ,然后再用: Array.isArray(obj)
#9
吹水佬2023-07-11 15:03
可以解析执行脚本
dom = CREATEOBJECT("htmlfile")
dom.write('<script>var fun=function(jsonString){return JSON.parse(jsonString);}</script>')
win = dom.parentWindow
obj = win.fun('{"name":"Roob","type":"CCC"}')
? obj.name, obj.type
#10
yiyanxiyin2023-07-11 17:19
function isArray(arr) {
  const toString = Object.prototype.toString
  const isArray = Array.isArray || function (arg) { return toString.call(arg) === '[object Array]' }
  return isArray(arr)
}
#11
吹水佬2023-07-12 16:56
回复 8楼 easyppt
可以的话,最好是用解释器调用JS,自定义几个函数就可以判断对象和获取对象属性。
程序代码:

TEXT TO cJson TEXTMERGE NOSHOW PRETEXT 15
{"traces":[{"acceptTime":"2016-12-03 12:24:25","acceptAddress":"宿州市","remark":"宿州市邮政速递公司北区揽投部已收件(揽投员姓名:陆登杰,联系电话:18955780863)"},{"acceptTime":"2016-12-03 18:45:11","acceptAddress":"宿州市","remark":"离开宿州市 发往蚌埠市"},{"acceptTime":"2016-12-03 21:13:10","acceptAddress":"蚌埠市","remark":"到达蚌埠市处理中心(经转)"},{"acceptTime":"2016-12-03 21:14:29","acceptAddress":"蚌埠市","remark":"离开蚌埠市 发往南京市(经转)"},{"acceptTime":"2016-12-04 01:31:00","acceptAddress":"南京市","remark":"到达EMS航空集散中心(南京)处理中心(经转)"},{"acceptTime":"2016-12-04 06:34:00","acceptAddress":"南京市","remark":"离开南京市 发往北京市(经转)"},{"acceptTime":"2016-12-04 08:39:00","acceptAddress":"北京市","remark":"到达  中国邮政速递物流股份有限公司北京市邮件处理中心(航 处理中心"},{"acceptTime":"2016-12-04 11:22:04","acceptAddress":"北京市","remark":"离开中国邮政速递物流股份有限公司北京市国货航航空邮件处 发往北京邮政速递上地区域分公司清华营投部"},{"acceptTime":"2016-12-04 13:23:00","acceptAddress":"北京市","remark":"北京邮政速递上地区域分公司清华营投部安排投递,预计23:59:00前投递"},{"acceptTime":"2016-12-04 15:50:40","acceptAddress":"北京市","remark":"投递并签收,签收人:本人收"}]}
ENDTEXT
TEXT TO jsCode TEXTMERGE NOSHOW PRETEXT 15
<script>
var json     = function(jsonString){return JSON.parse(jsonString);};
var toString = function(obj){return Object.prototype.toString.call(obj);};
var getValue = function(obj,name){return obj[name];};
var isArray  = function(obj){return Array.isArray(obj);};
var getArray = function(obj,num){return obj[num];};
</script>
ENDTEXT
dom = CREATEOBJECT("htmlfile")
dom.write(jsCode)
win  = dom.parentWindow
json = win.json(cJson)
? win.toString(json.traces)
? win.isArray(json.traces)
FOR i=0 TO json.traces.length-1
    obj = win.getArray(json.traces,i)
    ? win.getValue(obj,"acceptAddress"), win.getValue(obj,"remark")
ENDFOR



[此贴子已经被作者于2023-7-13 06:44编辑过]

#12
easyppt2023-07-12 19:38
json = win.json(cJson)

这句显示错误: OLE 错误码 0x80020101:未知的COM状态码
WIN11系统
#13
吹水佬2023-07-12 20:52
以下是引用easyppt在2023-7-12 19:38:32的发言:

json = win.json(cJson)

这句显示错误: OLE 错误码 0x80020101:未知的COM状态码
WIN11系统

看看注册表
\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

vfp开发环境时,增加数据项:
vfp9.exe    DWORD值11111(10进制)

重启vfp
#14
easyppt2023-07-12 21:25
吹版,按照你说的,可以了
要是编译成EXE,是不是注册表 也要加进去啊?

[此贴子已经被作者于2023-7-12 22:00编辑过]

#15
吹水佬2023-07-13 06:48
以下是引用easyppt在2023-7-12 21:25:46的发言:

要是编译成EXE,是不是注册表 也要加进去啊?

是,按EXE的文件名。

#16
sostemp2023-07-15 13:21
以下是引用吹水佬在2023-7-12 16:56:44的发言:

可以的话,最好是用解释器调用JS,自定义几个函数就可以判断对象和获取对象属性。



吹版,怎么样将json字串中的所有key全自动转为小写?

[此贴子已经被作者于2023-7-15 13:22编辑过]

#17
吹水佬2023-07-15 16:13
以下是引用sostemp在2023-7-15 13:21:03的发言:

吹版,怎么样将json字串中的所有key全自动转为小写?

能解析执行JS的不用转换
#18
sostemp2023-07-15 21:06
以下是引用吹水佬在2023-7-15 16:13:39的发言:


能解析执行JS的不用转换

有的Key大小写解析会报错的,小写更通用便利些。
#19
吹水佬2023-07-15 22:33
以下是引用sostemp在2023-7-15 21:06:06的发言:


有的Key大小写解析会报错的,小写更通用便利些。

解析执行JS的大小写都可以,name就是一个字符串,试试:
程序代码:

TEXT TO jsCode TEXTMERGE NOSHOW PRETEXT 15
<script>
var json     = function(jsonString){return JSON.parse(jsonString);};
var getValue = function(obj,name){return obj[name];};
</script>
ENDTEXT
dom = CREATEOBJECT("htmlfile")
dom.write(jsCode)
js = dom.defaultView
json = js.json('{"Abcd":1234,"aB汉字CD":5678}')
? js.getValue(json,"Abcd")
? js.getValue(json,"aB汉字CD")





[此贴子已经被作者于2023-7-16 05:08编辑过]

#20
sostemp2023-07-16 09:42
以下是引用吹水佬在2023-7-15 22:33:11的发言:


解析执行JS的大小写都可以,name就是一个字符串,试试:

TEXT TO jsCode TEXTMERGE NOSHOW PRETEXT 15
<script>
var json     = function(jsonString){return JSON.parse(jsonString);};
var getValue = function(obj,name){return obj[name];};
</script>
ENDTEXT
dom = CREATEOBJECT("htmlfile")
dom.write(jsCode)
js = dom.defaultView
json = js.json('{"Abcd":1234,"aB汉字CD":5678}')
? js.getValue(json,"Abcd")
? js.getValue(json,"aB汉字CD")

这几天初学 json 这类知识点,个人理解。
谢谢回复,但是
用ScriptControl引入时解析略敏感,htmlfile相对不过敏。
但ScriptControl相对使用更便捷,htmlfile有可能还要设注册表。
小写时,两者均正常解析。大小写时,前者错,后者正常。
所以变化 Json数据中 key值为小写,更加捧一点。
#21
吹水佬2023-07-16 11:17
回复 20楼 sostemp
ScriptControl与htmlfile不是类同的东西
ScriptControl只是执行JS一些语句,并不是JS的解析器,有好多JS的东东他处理不了。
htmlfile原来是IE核心的解析器(html、xml、js等都可以解析),所以用到一些新标准时要修改注册表提高内核版本。




[此贴子已经被作者于2023-7-16 12:39编辑过]

#22
吹水佬2023-07-16 17:23
以下是引用sostemp在2023-7-16 09:42:40的发言:


这几天初学 json 这类知识点,个人理解。
谢谢回复,但是
用ScriptControl引入时解析略敏感,htmlfile相对不过敏。
但ScriptControl相对使用更便捷,htmlfile有可能还要设注册表。
小写时,两者均正常解析。大小写时,前者错,后者正常。
所以变化 Json数据中 key值为小写,更加捧一点。

ScriptControl解决不了json大小写name,json以字符串表达,不可能一次全部都替换成小写,如果要逐个name去替换,还不如直接用VFP的函数去解析JSON
#23
金戈铁马22023-08-30 21:40
学习!
1