+++ /dev/null
-/*\r
- * JSON string value\r
- *\r
- * Copyright(c) 2009 olyutorskii\r
- * $Id: JsString.java 917 2009-11-24 13:17:07Z olyutorskii $\r
- */\r
-\r
-package jp.sourceforge.jindolf.json;\r
-\r
-import java.io.IOException;\r
-\r
-/**\r
- * JSON 文字列Value。\r
- */\r
-public class JsString\r
- extends AbstractJsValue\r
- implements CharSequence, Comparable<JsString> {\r
-\r
- /**\r
- * FFFF形式4桁で16進エスケープされた文字列を読み、\r
- * 1文字にデコードする。\r
- * @param reader 文字入力\r
- * @return 文字\r
- * @throws IOException 入力エラー\r
- * @throws JsParseException パースエラーもしくは入力終了\r
- */\r
- static char parseHexChar(JsonReader reader)\r
- throws IOException, JsParseException{\r
- int hex1 = reader.read();\r
- int hex2 = reader.read();\r
- int hex3 = reader.read();\r
- int hex4 = reader.read();\r
- if(hex4 < '\u0000') throw new JsParseException();\r
-\r
- char hex1Ch = (char) hex1;\r
- char hex2Ch = (char) hex2;\r
- char hex3Ch = (char) hex3;\r
- char hex4Ch = (char) hex4;\r
-\r
- int digit1 = Character.digit(hex1Ch, 16);\r
- int digit2 = Character.digit(hex2Ch, 16);\r
- int digit3 = Character.digit(hex3Ch, 16);\r
- int digit4 = Character.digit(hex4Ch, 16);\r
-\r
- if(digit1 < 0) throw new JsParseException();\r
- if(digit2 < 0) throw new JsParseException();\r
- if(digit3 < 0) throw new JsParseException();\r
- if(digit4 < 0) throw new JsParseException();\r
-\r
- int digit = 0;\r
- digit += digit1;\r
- digit <<= 4;\r
- digit += digit2;\r
- digit <<= 4;\r
- digit += digit3;\r
- digit <<= 4;\r
- digit += digit4;\r
-\r
- char result = (char) digit;\r
-\r
- return result;\r
- }\r
-\r
- /**\r
- * ダブルクォーテーションで囲まれた文字列を読み込む。\r
- * @param reader 文字入力\r
- * @return 文字列Value\r
- * @throws IOException 入力エラー\r
- * @throws JsParseException パースエラーもしくは入力終了\r
- */\r
- static JsString parseString(JsonReader reader)\r
- throws IOException, JsParseException{\r
- int chData;\r
-\r
- Json.skipWhiteSpace(reader);\r
- chData = reader.read();\r
- if(chData < '\u0000') return null;\r
- if(chData != '"') throw new JsParseException();\r
-\r
- StringBuilder text = new StringBuilder();\r
-\r
- for(;;){\r
- chData = reader.read();\r
- if(chData < '\u0000') throw new JsParseException();\r
- if(chData == '"') break;\r
-\r
- if(chData == '\\'){\r
- chData = reader.read();\r
- if(chData < '\u0000') throw new JsParseException();\r
- if (chData == '"' ) text.append('"');\r
- else if(chData == '\\') text.append('\\');\r
- else if(chData == '/' ) text.append('/');\r
- else if(chData == 'b' ) text.append('\b');\r
- else if(chData == 'f' ) text.append('\f');\r
- else if(chData == 'n' ) text.append('\n');\r
- else if(chData == 'r' ) text.append('\r');\r
- else if(chData == 't' ) text.append('\t');\r
- else if(chData == 'u') text.append(parseHexChar(reader));\r
- else throw new JsParseException();\r
- }else{\r
- text.append((char)chData);\r
- }\r
- }\r
-\r
- JsString result = new JsString(text);\r
-\r
- return result;\r
- }\r
-\r
- /**\r
- * JSON 文字列Value形式で文字列を出力する。\r
- * @param appout 文字出力\r
- * @param seq 文字列\r
- * @throws IOException 出力エラー\r
- */\r
- public static void writeText(Appendable appout, CharSequence seq)\r
- throws IOException{\r
- appout.append('"');\r
-\r
- int length = seq.length();\r
- for(int pos = 0; pos < length; pos++){\r
- char ch = seq.charAt(pos);\r
-\r
- switch(ch){\r
- case '"' : appout.append('\\').append('"'); break;\r
- case '\\': appout.append('\\').append('\\'); break;\r
- case '/' : appout.append('\\').append('/'); break;\r
- case '\b': appout.append('\\').append('b'); break;\r
- case '\f': appout.append('\\').append('f'); break;\r
- case '\n': appout.append('\\').append('n'); break;\r
- case '\r': appout.append('\\').append('r'); break;\r
- case '\t': appout.append('\\').append('t'); break;\r
- default:\r
- if(Character.isISOControl(ch)){\r
- String hex = "0000" + Integer.toHexString(ch);\r
- hex = hex.substring(hex.length() - 4);\r
- appout.append("\\u").append(hex);\r
- }else{\r
- appout.append(ch);\r
- }\r
- break;\r
- }\r
- }\r
-\r
- appout.append('"');\r
-\r
- return;\r
- }\r
-\r
- private final String text;\r
-\r
- /**\r
- * コンストラクタ。\r
- * 空文字が設定される。\r
- */\r
- public JsString(){\r
- this(null);\r
- return;\r
- }\r
-\r
- /**\r
- * コンストラクタ。\r
- * 引数はJSON書式ではない。\r
- * @param seq 文字列。nullなら空文字が設定される。\r
- */\r
- public JsString(CharSequence seq){\r
- super();\r
- if(seq == null){\r
- this.text = "";\r
- }else{\r
- this.text = seq.toString();\r
- }\r
- return;\r
- }\r
-\r
- /**\r
- * {@inheritDoc}\r
- * @param index {@inheritDoc}\r
- * @return {@inheritDoc}\r
- * @throws IndexOutOfBoundsException {@inheritDoc}\r
- */\r
- public char charAt(int index)\r
- throws IndexOutOfBoundsException{\r
- return this.text.charAt(index);\r
- }\r
-\r
- /**\r
- * {@inheritDoc}\r
- * @return {@inheritDoc}\r
- */\r
- public int length(){\r
- return this.text.length();\r
- }\r
-\r
- /**\r
- * {@inheritDoc}\r
- * @param start {@inheritDoc}\r
- * @param end {@inheritDoc}\r
- * @return {@inheritDoc}\r
- * @throws IndexOutOfBoundsException {@inheritDoc}\r
- */\r
- public CharSequence subSequence(int start, int end)\r
- throws IndexOutOfBoundsException{\r
- return this.text.subSequence(start, end);\r
- }\r
-\r
- /**\r
- * {@inheritDoc}\r
- * @return {@inheritDoc}\r
- */\r
- @Override\r
- public int hashCode(){\r
- return this.text.hashCode();\r
- }\r
-\r
- /**\r
- * {@inheritDoc}\r
- * @param obj {@inheritDoc}\r
- * @return {@inheritDoc}\r
- */\r
- @Override\r
- public boolean equals(Object obj){\r
- if(obj == null) return false;\r
- if(this == obj) return true;\r
-\r
- if( ! (obj instanceof JsString) ) return false;\r
- JsString string = (JsString) obj;\r
-\r
- return this.text.equals(string.text);\r
- }\r
-\r
- /**\r
- * {@inheritDoc}\r
- * @param value {@inheritDoc}\r
- * @return {@inheritDoc}\r
- */\r
- public int compareTo(JsString value){\r
- if(this == value) return 0;\r
- if(value == null) return +1;\r
- return this.text.compareTo(value.text);\r
- }\r
-\r
- /**\r
- * {@inheritDoc}\r
- * @return {@inheritDoc}\r
- */\r
- @Override\r
- public String toString(){\r
- StringBuilder string = new StringBuilder();\r
- try{\r
- writeText(string, this.text);\r
- }catch(IOException e){\r
- assert false;\r
- }\r
- return string.toString();\r
- }\r
-\r
- /**\r
- * クォーテーションされていない生の文字列を返す。\r
- * @return 生の文字列\r
- */\r
- public String toRawString(){\r
- return this.text;\r
- }\r
-\r
-}\r