問題
同事需要將一個 JSON 字串,裡面屬性值需要透過 Replace 的方式,來置換新的內容。但那些內容之中包含一些 JSON 的保留字,例如 / // 等字串。所以字串 Replace 之後,透過 JObject.Parse 去處理就報錯了。
1
2
3
4
5
6var tmpJsonStringBefore = @"{s:""@s""}";
var o = JObject.Parse(tmpJsonStringBefore);
var s = "A\" string !@#$%^&*(){}:\"?/?/|\"':>;><{\"d\":\"v\" value";
var tmpJsonAfter = tmpJsonStringBefore.Replace("@s", s);
var tmpJson = JObject.Parse(tmpJsonAfter);
Console.WriteLine(tmpJson.ToString());
以上的 Code 一執行就會出「*Newtonsoft.Json.JsonReaderException: ‘After parsing a value an unexpected character was encountered: s. Path ‘s’, line 1, position 7.’*」
解法
這時我們需要針對內容來做 Encode ,可以透過 HttpUtility.JavaScriptStringEncode (加入 System.Web 參考),如下,
1
2
3
4
5
6
7var tmpJsonStringBefore = @"{s:""@s""}";
var o = JObject.Parse(tmpJsonStringBefore);
var s = "A\" string !@#$%^&*(){}:\"?/?/|\"':>;><{\"d\":\"v\" value";
var encodeS = HttpUtility.JavaScriptStringEncode(s);
var tmpJsonAfter = tmpJsonStringBefore.Replace("@s", encodeS);
var tmpJson = JObject.Parse(tmpJsonAfter);
Console.WriteLine(tmpJson.ToString());
執行結果如下圖,