JSON编码字符串文字;asdf\\nsedfgs";

JSON编码字符串文字;asdf\\nsedfgs";,json,vbscript,Json,Vbscript,我正在使用一个旧的经典asp/vbscript应用程序,它有一个json类 我有一个字符串文本:asdf\\nsedfgs。从字面上看,就是那些人物 所以,要在JSON字符串中使用该值,应该是这样的,对吗 {“somedesc”:“asdf\\\\nsedfgs”} …已转义两个反斜杠字符 然而,在退出JSON并返回到字符串文字的过程中,我们会这样做(按此顺序) …但是对于上面的字符串,这个replace()序列给出了错误的解码值: 结果(注意换行符,因为4个\被替换为两个,然后\n被替换为一个

我正在使用一个旧的经典asp/vbscript应用程序,它有一个json类

我有一个字符串文本:
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