3

我像这样调用谷歌的字典 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"));

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

json = json.Replace("dict_api.callbacks.id100(", "").Replace(",200,null)", "");
JObject o = JObject.Parse(json);

解析在遇到以下情况时死亡:

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

\x3cem\x3ebars\x

东西杀死了解析

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

aquinas对另一个“Parse JSONP”问题的回答显示了很好的正则表达式来处理 JSONP 部分(可能需要针对这种情况调整正则表达式),所以这里的主要部分是如何处理十六进制编码的字符。x = Regex.Replace(x, @"^.+?\(|\)$", "");

4

2 回答 2

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);
于 2012-09-11T04:04:39.337 回答
1

服务器没有返回有效的 JSON:JSON支持\xAB字符转义序列,只支持\uABCD转义序列。

我见过的“解决方案”首先在字符串上执行文本替换。这是我对 Java 的类似问题的回复之一。inputString.replaceAll("\\x(\d{2})", "\\u00$1")注意底部的正则表达式;适应语言。

于 2012-09-11T04:03:04.877 回答