如何使用JSON.NET解析格式错误的JSONP与十六进制编码的字符?

O.O*_*O.O 3 c# jsonp google-api json.net

我打电话给google的词典api,如下所示:

var json = new WebClient().DownloadString(string.Format(@"http://www.google.com/dictionary/json?callback=dict_api.callbacks.id100&q={0}&sl=en&tl=en", "bar"));
Run Code Online (Sandbox Code Playgroud)

但是我得到一个响应,该代码无法正确解析:

json = json.Replace("dict_api.callbacks.id100(", "").Replace(",200,null)", "");
JObject o = JObject.Parse(json);
Run Code Online (Sandbox Code Playgroud)

解析在遇到这个问题时死了:

"entries":[{"type":"example","terms":[{"type":"text","text":"\x3cem\x3ebars\x3c/em\x3e of sunlight shafting through the broken windows","language":"en"}]}]}
Run Code Online (Sandbox Code Playgroud)

\ x3cem\x3ebars\X

东西杀了解析

有没有办法用JSON.NET处理这个JSONP响应?

答案通过阿奎那的另一个"解析JSONP"问题表明不错的正则表达式x = Regex.Replace(x, @"^.+?\(|\)$", "");来处理与JSONP部分(可能需要调整这种情况正则表达式),所以主体这里是如何应对的十六进制编码的字符.

Qor*_*ani 9

参考:如何解码嵌入在json字符串中的HTML编码字符

字符串的JSON规范不允许十六进制ASCII转义序列,但只允许Unicode转义序列,这就是为什么转义序列无法识别,这就是为什么使用\ u0027应该工作...现在你可以盲目地用\替换\ x u00(这应该完全适用于有效的JSON,虽然有些评论可能在理论上受到损害,但谁在乎...:D)

因此,将代码更改为此将修复它:

        var json = new WebClient().DownloadString(string.Format(@"http://www.google.com/dictionary/json?callback=dict_api.callbacks.id100&q={0}&sl=en&tl=en", "bar"));

        json = json
                .Replace("dict_api.callbacks.id100(", "")
                .Replace(",200,null)", "")
                .Replace("\\x","\\u00");

        JObject o = JObject.Parse(json);
Run Code Online (Sandbox Code Playgroud)