JSONIC 是用来encode和decode json数据的library,倒入到WINF 的lib 文件夹中使用。
特征是可以不依赖变成语言来自由变换到 POJO。
import net.arnx.jsonic.JSON;
// POJOをJSONに変換します
String text = JSON.encode(new Hoge());
// JSONをPOJOに変換します
Hoge hoge = JSON.decode(text, Hoge.class);
Version 1.2.6 からは、JavaScript内での直接出力用に escapeScript が追加されました。JSONでは許されていない string, number など値の出力やXSS脆弱性を防ぐ<>のエスケープも行われます
// POJOをJavaScriptに変換します()
var value = <%= JSON.escapeScript(value) %>;
JSONICには、JSON操作APIだけでなく、JSONを使ったWebサービスが簡単に構築できるservletサーブレットも用意されています。詳しくはWebサービスAPIのドキュメントを御覧ください。
JSONエンコーダー encode from POJO to JSON
POJOからJSONに変換する場合は、encodeを使います。デフォルトでは、空白などを含まない可読性の低いJSONが出力されますが、二番目の引数をtrueにすることで可読性の高いJSONが出力されるようになります(Pretty Printモード)。
なお、JSONのformat フォーマット中に何らかの例外が発生した場合は、JSONExceptionでラップされ通知されます(Beanからの取得時に例外発生など)。
// 変換対象のPOJOを準備
Hoge hoge = new Hoge();
hoge.number = 10; // public field
hoge.setString("aaa"); // public property
hoge.setArray(new int[] {1, 2, 3});
// POJOをJSONに変換します。戻り値は {"number":10,"string":"aaa","array":[1,2,3]}となります json 的数据类型 : {“String”:object}
String text = JSON.encode(hoge);
// POJOを可読性の高いJSONに変換します。戻り値は次のような文字列になります
// {
// "number": 10,
// "string": "aaa",
// "array": [1, 2, 3]
// }
String text = JSON.encode(hoge, true); 有true参数后 json 的可读性就高了
// Appendable(StringBuffer, Writerなど)やOutputStreamを出力先にすることもできます(※1) 可以将json内容作为输出流写入到文件中。 OutStream不会自动关闭,要自己处理。
JSON.encode(hoge, new FileWriter("hoge.txt"));
JSON.encode(hoge, new FileOutputStream("hoge.txt"));
(※1) OutputStreamを指定した場合に出力される文字コードはUTF-8固定となります。 また、close処理は自動では行われませんので必要に応じて別途行う必要があります。
POJOからJSONへの変換ルールは次の通りです。
変換元(Java) | 変換先(JSON) |
Map, DynaBean(※2) | object |
Object(※3) | |
boolean[], short[], int[], long[], float[], double[], Object[] | array |
Iterable (Collection, Listなど) | |
Iterator, Enumeration | |
java.sql.Array, java.sql.Struct | |
char[], CharSequence | string |
char, Character | |
TimeZone, Pattern, File, URL, URI, Type, Member, Charset, UUID | |
byte[] | string (BASE64エンコード) |
java.sql.RowId | string (シリアル化後、BASE64エンコード) |
Locale | string (言語コード-国コードあるいは言語コード-国コード-バリアントコード) |
InetAddress | string (IPアドレス) |
byte, short, int, long, float, double | number(※4) |
Number | |
Date, Calendar | number (1970年からのミリ秒) |
Enum | number (ordinalにより変換) |
boolean, Boolean | true/false |
null | null |
(※2) DynaBeanを利用する場合、Commons BeanUtilsのjarファイルをクラスパスに追加する必要があります。リフレクションを利用して処理を行っているため、利用しない場合は特に含める必要はありません。
(※3) 対象となるインスタンスをパブリック・getterメソッド、パブリック・フィールドの優先順で探索します。staticが付加されたメソッドやフィールド、transientが付加されたフィールドは対象となりません。
(※4) NaN, Infinity, -Infinityに限りそれぞれ文字列"NaN", "Infinity", "-Infinity"に変換されます。
また、org.w3c.dom.Document/ElementからJSONへの変換もサポートしています。詳しくは「高度な使い方 - XMLからJSONへの変換」の項をご覧ください。
encode处理的是object,和array转化成json 数据类型,不能直接将 int ,String 转化成json
なお、JSONはobjectかarrayで始まる必要があるため、直接、intやStringのインスタンスをencodeメソッドの引数に指定した場合エラーとなります。
JSONデコーダー decode from JSON to POJO
JSONからPOJOに変換する場合は、decodeを使います。デフォルトでは、object, array, string, number, true/false, nullをHashMap, ArrayList, String, BigDecimal, Boolean, nullに変換しますが、二番目の引数に変換先のclassクラスを指定することでそのクラスのインスタンスにデータをセットして返してくれます。また、この処理はpublic,field ,パブリック・フィールドやパブリック・プロパティ、配列やコレクションのデータを再帰的に辿り実行されますので、一般的なJavaBeansであればencodeして作られたJSONからの逆変換も可能です(Generics型にも対応しています)。
なお、JSON文字列が不正であったり、型の変換に失敗した場合はJSONExceptionが投げられます。
// JSONをPOJOに変換します。戻り値としてサイズが4のArrayListが返されます
List list = (List)JSON.decode("[1, \"a\", {}, false]");
// JSONをHogeクラスのインスタンスに変換します(不需要分配角色, slash是转义字符 转义双引号。数据对应 class的属性。キャストは不要です)
Hoge hoge = JSON.decode("{\"number\": 10, \"array\": [1, 2, 3]}", Hoge.class);
// クラスの配列型への変換も可能です。 也可以变换到class array。
Hoge[] data = JSON.decode("[{ \"id\": 1 }, { \"id\": 2 }, { \"id\": 3 }]", Hoge[].class);
// ReaderやInputStreamからJSONを読み込むことも可能です(※5)
Hoge hoge = JSON.decode(new FileReader("hoge.txt"), Hoge.class);
Hoge hoge = JSON.decode(new FileInputStream("hoge.txt"), Hoge.class);
(※5) InputStreamから読み込む場合の文字コードは、UTF-8/UTF-16BE/UTF-16LE/UTF-32BE/UTF-32LEから自動判別されます。 また、close処理は自動では行われませんので必要に応じて別途行う必要があります。
JSONからPOJOへの変換ルールは次の通りです。
変換元(JSON) | 指定された型 | 変換先(Java) |
object | なし, Object, Map | LinkedHashMap |
SortedMap | TreeMap | |
その他のMap派生型 | 指定された型 | |
その他の型 | 指定された型(パブリック・フィールド/プロパティに値をセット)(※6) | |
array | なし, Object, Collection, List | ArrayList |
Set | LinkedHashSet | |
SortedSet | TreeSet | |
その他のCollection派生型 | 指定された型 | |
short[], byte[], int[], long[], float[], double[] Object[]派生型 | 指定された型 | |
Locale | Locale(「言語コード」「国コード」「バリアントコード」からなる配列とみなし変換) | |
Map | インデックスの値をキーとするLinkedHashMap | |
SortedMap | インデックスの値をキーとするTreeMap | |
その他のMap派生型 | インデックスの値をキーとする指定された型のMap | |
string | なし, Object, CharSequence, String | String |
char | char(幅0の時は'\u0000', 2文字以上の時は1文字目) | |
Character | Character(幅0の時はnull, 2文字以上の時は1文字目) | |
Appendable | StringBuilder | |
その他のAppendable派生型 | 指定された型(値をappend) | |
Enum派生型 | 指定された型(値をEnum.valueOfあるいはint型に変換後Enum.ordinal()で変換) | |
Date派生型, Calendar派生型 | 指定された型(文字列をDateFormatで変換) | |
byte, short, int, long, float, double, Byte, Short, Integer, Long, Float, Double, BigInteger, BigDecimal | 指定された型(文字列を数値とみなし変換) | |
byte[] | byte[](文字列をBASE64とみなし変換) | |
Locale | Locale(文字列を「言語コード」「国コード」「バリアントコード」が何らかの句読文字で区切られているとみなし変換) | |
Pattern | Pattern(文字列をcompileにより変換) | |
Class, Charset | 指定された型(文字列をforNameにより変換) | |
TimeZone | TimeZone(文字列をTimeZone.getTimeZoneを使い変換) | |
UUID | UUID(文字列をUUID.fromStringで変換) | |
File, URI, URL | 指定された型(文字列をコンストラクタの引数に指定し変換) | |
InetAddress | InetAddress(文字列をInetAddress.getByNameで変換) | |
boolean, Boolean | 指定された型("", "false", "no", "off", "NaN"の時false、その他の時true) | |
number | なし, Object, Number, BigDecimal | BigDecimal |
byte, short, int, long, float, double, Byte, Short, Integer, Long, Float, Double, BigInteger | 指定された型 | |
Date派生型, Calendar派生型 | 指定された型(数値を1970年からのミリ秒とみなし変換) | |
boolean, Boolean | 指定された型(0以外の時true、0の時false) | |
Enum派生型 | 指定された型(int値をEnum.ordinal()に従い変換) | |
true/false | なし, Object, Boolean | Boolean |
char, Character | 指定された型(trueの時'1'、falseの時'0') | |
float, double, Float, Double | 指定された型(trueの時1.0、falseの時NaN) | |
byte, short, int, long, Byte, Short, Integer, Long, BigInteger | 指定された型(trueの時1、falseの時0) | |
boolean | boolean | |
Enum派生型 | 指定された型(trueを1、falseを0とみなしEnum.ordinal()に従い変換) | |
null | なし, Object | null |
byte, short, int, long, float, double | 0 | |
boolean | false | |
char | '\u0000' |
(※6) 対象となるインスタンスに対しパブリックなsetterメソッド、パブリックなフィールドの優先順で探索します。 staticやtransientのメソッド/フィールドは対象となりません。 なお、プロパティ名は、単純比較が失敗した場合、LowerCamel記法に変換したものと比較します。
Passbook中的使用例子
* orderbyとkeywordのオプション付き検索結果を返す
* @return
*/
@Execute(urlPattern =
"{page}/{offset}/{limit}/{
false)
这些都是传递来的参数
public String searchWithSimpleOptions() {
int page = Integer.parseInt(
int offset = Integer.parseInt(
int limit = Integer.parseInt(
String sortKey = generatedPassListForm.sortKey;
String sortOrder = generatedPassListForm.
String keyword = generatedPassListForm.keyword;
GeneratedPassPackageDto generatedPassPackageDto =
generatedPassListService.
sortOrder, keyword);
ResponseUtil.write(JSON.
"text/javascript");
return null;