JSONIC 是用来encode和decode json数据的lib

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}/{ sortKey}/{sortOrder}/{keyword} ", validator =
false)
这些都是传递来的参数
    public String searchWithSimpleOptions() {

        int page = Integer.parseInt( generatedPassListForm.page);

        int offset = Integer.parseInt( generatedPassListForm.offset);

        int limit = Integer.parseInt( generatedPassListForm.limit);

        String sortKey = generatedPassListForm.sortKey;

        String sortOrder = generatedPassListForm. sortOrder;

        String keyword = generatedPassListForm.keyword;


        GeneratedPassPackageDto generatedPassPackageDto =
generatedPassListService. getPassList(page, offset, limit, sortKey,
sortOrder, keyword);


        ResponseUtil.write(JSON. encode( generatedPassPackageDto),
"text/javascript");

        return null;

//Reponse返回的必须是转换格式到  text/javascript ,return null.
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值