PHPでjson_encodeした文字列をC#でデコードするときの注意事項
ちょっとはまったのでメモします。
PHP側で例えば
<?php class Bean{ public $str = "もげほげ"; }; echo json_encode(new Bean()); ?>
とする*1。
で、これをC#側で、
String postdata = "tokuninashi"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@"http://example.com/api/"); request.Method = "POST"; request.Headers.Add(HttpRequestHeader.Pragma.ToString(), "no-cache"); request.Headers.Add(HttpRequestHeader.ContentEncoding, "UTF-8"); Byte[] postbytes = Encoding.UTF8.GetBytes(postdata); request.ContentLength = postbytes.Length; Stream stream = request.GetRequestStream(); stream.Write(postbytes, 0, postbytes.Length); //本題はここから HttpWebResponse response = (HttpWebResponse)request.GetResponse(); String result = new StreamReader(response.GetResponseStream()).ReadToEnd(); Console.WriteLine(result);
とすると、出力は
{"str":"\u3082\u3052\u307b\u3052"}"
となる*2
んで、これUTF-8の文字列がURLエンコードされているのだけれども、単純に
result = System.Web.HttpUtility.UrlDecode(result);
とだけしても、だめで、前処理として円記号をパーセント記号に変換してあげる必要があって、
result = result.Replace(@"\", @"%"); result = System.Web.HttpUtility.UrlDecode(result);
としないとだめ。
少しばかりはまった。