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"}]}]}

The

\ x3cem \ x3ebars \ x

ものは解析を殺します

このJSONP応答をJSON.NETで処理する方法はありますか?

別の「JSONPの解析」の質問に対するaquinas回答は、JSONP部分で処理するための優れた正規表現を示しています(この場合は正規表現を微調整する必要があるかもしれません)。したがって、ここでの主要な部分は、16進エンコードされた文字の処理方法です。x = Regex.Replace(x, @"^.+?\(|\)$", "");

4

2 に答える 2

9

参照:json文字列に埋め込まれたHTMLエンコード文字をデコードする方法

文字列のJSON仕様では、16進数の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を返していません\xAB。JSONは文字エスケープシーケンスをサポートしておらず、シーケンスをエスケープするだけ\uABCDです。

私が見た「解決策」は、最初に文字列に対してテキスト置換を実行します。これは、Javaに関する同様の質問に対する私の回答の1つです。inputString.replaceAll("\\x(\d{2})", "\\u00$1")下部の正規表現に注意してください。言語に適応します。

于 2012-09-11T04:03:04.877 に答える