2017-04-04 89 views
1

我正在使用具有json類的舊的經典asp/vbscript應用程序。JSON編碼字符串文字「asdf \ nsedfgs」

我有一個字符串文字:asdf\\nsedfgs那不是逃避json或任何東西。它字面上的那些字符。

因此,要在JSON字符串中使用該值,它應該是這樣的,對吧?

{"somedesc":"asdf\\\\nsedfgs"}

...與兩個反斜槓字符轉義。

然而,出路JSON,回到字符串文字,我們會做這樣的事情(按照這個順序)

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)) 

...但上面的字符串,這個序列替換()爲我們提供了不正確的解碼值:

結果(注意換行,爲4 \得到了更換兩個,那麼\n得到了更換,換行)

asdf\ 
sedfgs 

所以問題:

  1. 如何正確地編碼和解碼文字asdf\\nsedfgs來自和json?
  2. 是解碼邏輯正確嗎?按正確的順序?它似乎不是,因爲它如何區分字面\n與逃脫chr(13)
  3. 還有什麼我在這裏失蹤?

回答

1

的重要組成部分,被隔離的字符串的其餘部分轉義反斜槓,使他們不妨礙逃生你sequences-可以分割字符串,重新安裝缺少的部分後:

Const ENCODE = FALSE 
Const DECODE = TRUE 

val = "asdf\\\\nsedfgs" 
val = JSON(val, DECODE) 
MsgBox val 

'Swap replacement values & dividers + concatenation characters 
val = JSON(val, ENCODE) 
MsgBox val 

Function JSON(ByVal str, ByVal mode) 
    Dim key, val 
    Set d = CreateObject("Scripting.Dictionary") 

    d.Add "\/", "/" 
    d.Add "\b", Chr(8) 
    d.Add "\f", Chr(12) 
    d.Add "\n", Chr(10) 
    d.Add "\r", Chr(13) 
    d.Add "\t", Chr(9) 

    If mode Then 
     d.Add "\""", """" 
     d.Add "\\", "\" 
     div = "\\" 
     cat = "\" 
     key = d.Keys 
     val = d.Items 
    Else 
     d.Add "\\", "\" 
     d.Add "\""", """" 
     div = "\" 
     cat = "\\" 
     key = d.Items 
     val = d.Keys 
    End If 

    arr = Split(str, div) 

    For i = 0 To UBound(arr) 
     For j = 0 To UBound(key) 
      arr(i) = Replace(arr(i), key(j), val(j)) 
     Next 

     output = output & arr(i) 
     If i <> UBound(arr) Then output = output & cat 
    Next 

    d.RemoveAll 
    JSON = output 
End Function 
+2

這是我的問題的一個很好的解決方案。對我來說,令人驚訝的是,有多少JSON解析器無法處理這種情況(以及其他許多邊界情況)。閱讀[解析JSON是一個Minefield](http://seriot.ch/parsing_json.php)來感受我在說什麼。他針對常見測試案例測試了50或60個解析器,沒有兩個具有相同的合格/不合格結果。 – GWR

+2

它只是歸結爲使用具有良好支持的框架,個人而言,我推薦這個[JSON對象類3.5.4由RCDMK](https://github.com/rcdmk/aspJSON),因爲它有很好的支持開發人員正在積極研究它。 – Lankymart

+0

@GWR剛剛測試過庫,它處理得很好 - 「asdf \\ nsedfgs」變成了'asdf \\\\ nsedfgs'等。這是使用庫的v3.5.4,它是在2月份最後更新的。以下是使用該庫的代碼的最新示例 - [Output ADODB.RecordSet as JSON](// stackoverflow.com/a/42417686)。 – Lankymart