2017-07-30 95 views
0

我有這樣的擴展功能:定義JProperty.Value(集)的字符串轉換設置

<Extension> Sub SetPropertiesValue(jsontoken As JToken, 
            propertypath As String, 
            newvalue As Object) 
    Dim jsonproperties = jsontoken.SelectTokens(propertypath).OfType(Of JValue).Select(Function(jv) jv.Parent).OfType(Of JProperty) 
    For Each jp In jsonproperties 
     jp.Value = newvalue 
    Next 
End Sub 

當我通過爲newvalue非ASCII字符的字符串,如「Açúcar山」,它集財產"propertyname" : "açúcar"

如何告訴JSON.NET轉義非ASCII字符,以便操作的結果爲"propertyname" : "a\u00e7\u00facar"

+1

儘管在JSON和Json.NET中肯定會有這種情況,但您確定要解決需要解決的問題並在正確的位置解決問題嗎? JSON文件和數據流需要使​​用Unicode編碼,因此不必進行此類轉義。事實上,VB源文件的故事有點類似。如果需要,VB源文件_can_可以用非Unicode編碼進行編碼,但如同JSON一樣,內容最終是Unicode。 (JSON和VB通常使用Unicode編碼之一的UTF-8進行編碼)。那麼你想要解決什麼問題? –

+0

那麼,至於我的理由,我編寫了一個程序,通過規避其接口並通過http請求將json postdata直接發送到服務器,從而將大量數據發送到Intranet應用程序,並且工作正常。但它是通過在模板json字符串上查找和替換來實現的,並且我希望使用JToken更一致地執行此操作。由於我所檢查的所有通信都逃避了所有非ASCII字符,我希望不會有所不同。 – VBobCat

回答

1

使用Json.NET時,創建JToken層次結構時不會發生字符串轉義。它僅在通過設置JsonWriter.StringEscapeHandling最終轉換爲JSON字符串期間發生。這是因爲字符串轉義是JSON的字符串表示的人爲因素。由於JToken層次代表已經標記並解析了 JSON,因此不再需要字符串文字內控制字符的轉義。

一旦你有你JToken根對象,你可以控制字符串設定JsonSerializerSettings.StringEscapeHandling然後序列化你的對象最終輸出過程中逃逸:

Dim settings = New JsonSerializerSettings With { _ 
     .StringEscapeHandling = StringEscapeHandling.EscapeNonAscii _ 
    } 
    Dim json = JsonConvert.SerializeObject(jsontoken, Formatting.Indented, settings) 

或者,如果你喜歡用較低級別的公用事業工作,就可以構建自己的JsonTextWriter與適當的設置,如下所示:

Dim sb = new StringBuilder() 
    Using textWriter as new StringWriter(sb) 
     Using jsonWriter as new JsonTextWriter(textWriter) With { .StringEscapeHandling = StringEscapeHandling.EscapeNonAscii, .Formatting = Formatting.Indented } 
      jsontoken.WriteTo(jsonWriter) 
     End Using 
    End Using 
    Dim json = sb.ToString() 

StringEscapeHandling的可能值被示出here

Default   0 Only control characters (e.g. newline) are escaped. 
EscapeNonAscii 1 All non-ASCII and control characters (e.g. newline) are escaped. 
EscapeHtml  2 HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. 

示例VB.Net fiddle