JSON编码字符串文字;asdf\\nsedfgs";
我正在使用一个旧的经典asp/vbscript应用程序,它有一个json类 我有一个字符串文本:JSON编码字符串文字;asdf\\nsedfgs";,json,vbscript,Json,Vbscript,我正在使用一个旧的经典asp/vbscript应用程序,它有一个json类 我有一个字符串文本:asdf\\nsedfgs。从字面上看,就是那些人物 所以,要在JSON字符串中使用该值,应该是这样的,对吗 {“somedesc”:“asdf\\\\nsedfgs”} …已转义两个反斜杠字符 然而,在退出JSON并返回到字符串文字的过程中,我们会这样做(按此顺序) …但是对于上面的字符串,这个replace()序列给出了错误的解码值: 结果(注意换行符,因为4个\被替换为两个,然后\n被替换为一个
asdf\\nsedfgs
。从字面上看,就是那些人物
所以,要在JSON字符串中使用该值,应该是这样的,对吗
{“somedesc”:“asdf\\\\nsedfgs”}
…已转义两个反斜杠字符
然而,在退出JSON并返回到字符串文字的过程中,我们会这样做(按此顺序)
…但是对于上面的字符串,这个replace()序列给出了错误的解码值:
结果(注意换行符,因为4个\
被替换为两个,然后\n
被替换为一个换行符)
因此,问题是:
asdf\\nsedfgs
编码和解码为json\n
和转义chr(13)
重要的部分是将转义反斜杠与字符串的其余部分隔离,以便它们不会干扰转义序列-您可以拆分字符串,稍后重新连接缺失的部分:
Const ENCODE=FALSE
Const DECODE=TRUE
val=“asdf\\\\nsedfgs”
val=JSON(val,解码)
MsgBox val
'交换替换值和除法器+串联字符
val=JSON(val,ENCODE)
MsgBox val
函数JSON(ByVal str,ByVal模式)
暗键
Set d=CreateObject(“Scripting.Dictionary”)
d、 添加“\/”,“/”
d、 添加“\b”,Chr(8)
d、 加上“\f”,Chr(12)
d、 加上“\n”,Chr(10)
d、 加上“\r”,Chr(13)
d、 加上“\t”,Chr(9)
如果是模式,那么
d、 添加“\”、“”
d、 添加“\\”,“\”
div=“\\”
cat=“\”
钥匙
val=d.项目
其他的
d、 添加“\\”,“\”
d、 添加“\”、“”
div=“\”
cat=“\\”
关键字=d.项目
val=d.键
如果结束
arr=拆分(str,div)
对于i=0至UBound(arr)
对于j=0至UBound(键)
arr(i)=替换(arr(i)、键(j)、值(j))
下一个
输出=输出和arr(i)
如果我上传(arr),则输出=输出和cat
下一个
d、 移除
JSON=输出
端函数
这是解决我问题的好办法。我很惊讶有多少JSON解析器无法处理这种情况(以及许多其他边缘情况)。通过阅读了解我在说什么。他针对常见的测试用例测试了50或60个解析器,没有两个具有相同的通过/失败结果。就个人而言,这归结为使用了一个具有良好支持的框架,我推荐这一款,因为它有很好的支持,开发人员正在积极开发。@GWR刚刚测试了该库,它处理得很好-asdf\\nsedfgs
变成了asdf\\\\nsedfgs
等。它使用的是该库的v3.5.4,上次更新是在2月份。下面是使用库的最新代码示例-。感谢您的更新。不知道iit是否也能正确解码?e、 g.asdf\\\\nsedfgs
进入时应解码为asdf\\nsedfgs
(其他一些人会错误地将\n
首先替换为换行符)。等我有空的时候,我会自己测试,然后再报告。@GWR虽然不创建换行符,但会做其他更令人担忧的事情。我在使用JSON.parse()
传入时尝试过的示例数据在您尝试使用JSON.Serialize()
将其拉出后会被破坏,这显然是错误的。可能会在GitHub回购协议中提出这一问题。
val = Replace(val, "\""", """")
val = Replace(val, "\\", "\")
val = Replace(val, "\/", "/")
val = Replace(val, "\b", Chr(8))
val = Replace(val, "\f", Chr(12))
val = Replace(val, "\n", Chr(10))
val = Replace(val, "\r", Chr(13))
val = Replace(val, "\t", Chr(9))
asdf\
sedfgs