2008年10月16日木曜日

JSONICで文字化け

スズキです。

PHPからStompでデータを下記のようなJSONでActiveMQに送信し、
{"sample1":"\u30c6\u30b9\u30c81","sample2":"\u30c6\u30b9\u30c82"}
S2JMSで受信して、JSONICでJavaBeansに入れたら、
マルチバイト文字が文字化けしてました。(また文字化けかー...)

つまり、
--------(引数:json)
SampleDto dto = JSON.decode(json, SampleDto.class);
で文字化けです。

いろいろ試したのですが、スマートな解決法が見つからず、
下記のようにJSONデータのマルチバイト文字部分を、
泥臭く変換して対応しました。
--------(引数:json)
Pattern pattern =
Pattern.compile("u[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]");
Matcher matcher = pattern.matcher(json);
StringBuffer sb = new StringBuffer();
while(matcher.find()) {
  char tmp = (char)Integer.parseInt(matcher.group().substring(1), 16);
  matcher.appendReplacement(sb, String.valueOf(tmp));
}
matcher.appendTail(sb);
SampleDto dto = JSON.decode(sb, SampleDto.class);

どうせなら、この辺、S2JMSのFilterで隠せないかなー?

--
http://suz-lab.blogspot.com/

0 コメント: