1.スプライシング複雑なネストされたJSON
前者はJSON配列を表すJSONオブジェクトを表し、JSONObjectとJSONArray:FastJsonキットには2つの主なクラスを含みます。どちらもObject型のオブジェクトを追加することができますが、()メソッドのみadd()メソッドを置かないJSONArray。これはのみの要素を追加することができ、関連する、JSON配列のJSON配列を定義されていますが、キーと値のペアを追加することはできません。それはオブジェクトであるためJSONObjectは、他のオブジェクトを収容することができない、あなたは()メソッドを追加しないで、オブジェクトを追加することはできません、それだけで、キーと値のペアを追加する()メソッドを配置します。JSONObjectとJSONArrayは2つだけのいずれかを選択し、またはキーと値のペアを追加したり、要素を追加するadd()メソッドを使用するJSONArray()メソッドでJSONObjectを入れているようです。実際にあなたがプットのJSONObect(文字列キー、オブジェクト値)メソッドのパラメータ値がObject型である、の両方を行うことができ、その後、このタイプのデータもJSONArrayのタイプにすることができます。この場合、あなたは簡単にネストされた複雑なデータ・タイプの息子をスプライシングされたために、配列内のJSON JSONオブジェクトを追加することができます。
データ形式を、以下のJSONを返すには、従来の手ステッチが非常に達成するのは困難で、エラーが発生しがちになります。
1)まず、最も内側の分析から始まり、最も内側の層は、2つのJSONオブジェクトである、項目{「:」ディレクトリ管理」から『URL『:』/システム/ MENU / Tomain』}、対応するエンティティ・オブジェクトは、JSONを有しますクラスAdminMenu、外層は、JSON含まれる2つのオブジェクトの配列です。
MENU1 = AdminMenu 新しい新しいAdminMenu(); menu1.setUrl( "/システム/ MENU / Tomain" ); menu1.setName( "カタログ管理"); // よる"のgetItem(){戻り名} "、 すなわち、それはのsetNameのみ配置されています。でき AdminMenuメニュー2 = 新しい新しいAdminMenuは(); menu2.setUrl( "/システム/ユーザー/ Tomain" ); menu2.setName( "ユーザー管理" ); JSONArray level2Array = 新新JSONArray(); // エンティティクラスを追加します2 JSONデータは、FastJsonエンティティ・クラスを自動的にJSONオブジェクトに変換され level2Array.add(MENU1); level2Array.add(メニュー2)。
2)次に、分析レベル2(JSONデータ)及びレベル1(キーと値のペア)は、JSONオブジェクトにこれら2つのプロパティを追加し、2つの匿名JSONオブジェクトの属性です。
JSONObject menuInfoElement = 新しいJSONObject(); menuInfoElement.put( "レベル2" 、level2Array)。 menuInfoElement.put( "レベル1"、 "系统管理");
3)そして、匿名JSONを分析するオブジェクト menuInfoElementが配列menuInfoのJSONの唯一の要素は、ある匿名JSONオブジェクト menuInfoElementが追加menuInfoアレイ。
JSONArray menuInfoArray = 新しいJSONArray(); menuInfoArray.add(menuInfoElement)。
4)再分析、menuInfoは、コンテンツの属性は、JSONオブジェクトであります
JSONObject contentObj = 新しいJSONObject(); contentObj.put( "menuInfo"、menuInfoArray)。
5)最後に、返されたオブジェクトのJSONの最終的な特性として「ステータス」「コンテンツ」「メッセージ」
JSONObject jsonMainObj = 新しいJSONObject(); jsonMainObj.put( "ステータス"、 "成功" )。 jsonMainObj.put( "メッセージ"、 "查询成功" )。 jsonMainObj.put( "コンテンツ"、contentObj)。
テストコード
@Test 公共 無効testJson1() { AdminMenu MENU1 = 新新AdminMenu(); menu1.setUrl( "/システム/ MENU / Tomain" ); menu1.setName( "カタログ管理"); // 「のgetItem(による){名を返します}」、それを提供することができる唯一のsetName AdminMenuメニュー2 = 新しい新しいAdminMenu(); menu2.setUrl( "/システム/ユーザ/ Tomain" ); menu2.setName( "ユーザ管理" ); JSONArray level2Array = 新しい新しいJSONArray(); / / 2 JSONデータ・エンティティのクラスを追加し、FastJsonエンティティクラスは、自動的にオブジェクトのJSONとなるであろう level2Array.add(MENU1)。 level2Array.add(MENU2)。 JSONObject menuInfoElement = 新しいJSONObject(); menuInfoElement.put( "レベル2" 、level2Array)。 menuInfoElement.put( "レベル1"、 "系统管理" ); JSONArray menuInfoArray = 新しいJSONArray(); menuInfoArray.add(menuInfoElement)。 JSONObject contentObj = 新しいJSONObject(); contentObj.put( "menuInfo" 、menuInfoArray)。 JSONObject jsonMainObj = 新しいJSONObject(); jsonMainObj.put("状態"、 "成功" ); jsonMainObj.put( "メッセージ"、 "查询成功" )。 jsonMainObj.put( "コンテンツ" 、contentObj)。 System.out.println(jsonMainObj.toJSONString())。 }
文字列を出力
{ "メッセージ": "成功したクエリ"、 "コンテンツ":{ "menuInfo":[{ "レベル2":[{ "項目": "ディレクトリ管理"、 "名前": "ディレクトリ管理"、 "URL": " /システム/ MENU / Tomain "}、 {"アイテム":"ユーザ管理""名":"ユーザ管理"" URL ":" /システム/ユーザ/ Tomain "}]、 "レベル1 ":"システム管理"}]}、 "ステータス":"成功「}
2.エンティティクラスに依存しない、キーと値のペアをJSONから書式文字列を解析し、
そこJSONObjectのparseObject(String型のテキスト、クラス<T> clazz)静的メソッド、型TのJSON形式のJavaオブジェクトに解析された文字列; JSONArrayもparseArray(文字列のテキスト、クラス<T> clazz)リストを<JSON文字列を解析し、 T>コレクションオブジェクト。
しかし、それらはすべて一度だけの一時的な使用に行ってきました、私たちは一度解析されたキーと値のペアのいずれかになりますつまり、あなたはエンティティクラスに対応するクラスを持っている必要があり、パラメータとしてClassオブジェクトを渡す必要があり、何度新しいエンティティクラスを作成し、クラスが爆発につながります。
別のアイデアを入れて、JSONArray.parseArray(文字列テキスト)がJSONArrayオブジェクトを返します。それは要素型のエンティティ・クラスとすることができる、パラメトリックタイプオブジェクトに(オブジェクトOBJ)を追加することによる方法では、共通の目標JSON JSONObjectであってもよいです。しかし、現在、私たちは、それぞれの要素は、したがって、Objectから強制されますJSONObject、でなければならない静的メソッドは、JSON文字列に導入された、JSON配列を構築するために、あなたはその内部の要素型のを確認することができますparseArray(文字列テキスト)を呼び出しますJSONObjectは型に変換し、各JSONObjectからキーを削除します。
@Test 公共 ボイドparseJsonText() { 文字列メニューリスト = "[{ 'ID' :. 1、 'ロック':falseに、 'loginedTime': '2014年1月21日'}、" '、2:+「{ 'ID'ロック「:本当、に」loginedTime「:」2015年3月22日「}、] " ; / * * Userクラスを対応する名前がある属性、それはこの形式で書くことができますが、何のUserクラスはありません、 *リストを達成することはできません<ユーザー> ULIST = JSONArray.parseArray(メニューリスト、User.classは); * / JSONArray jUsers = JSONArray.parseArray(メニューリスト); / ** *ループのために、この5月 *がために(int型私= 0; I <jUsers.size(); Iは++){ JSONObject =ユーザーjUsers.getJSONObject(I)。 } * / について(userObjオブジェクト:jUsers) { JSONObjectのjuser =(JSONObject)userObjを; // キャスト、特定の要素のタイプを知ることは、その後エラーなしJSONObject、ある / ** * { 'ID':キーと値のペア1}。 1ない引用値、それがデジタルであるFASTJSONこと、 * {「ID」:「1」の場合 } フォーマット、FASTJSONは、それが文字列であると、エラーが整数に変換される * / 整数ID =(整数)jUser.get (「ID」); / * 偽のキーと値のペアなし引用符、FASTJSONブール型として扱わ、* {「ロック」} * {「ロック」:「偽」であれば } 文字列と見なさ形式、FASTJSON 、キャストランタイムエラーブール * * / ブール =(ロックされたブール値)jUser.get( "ロック" ); 文字列loginTime=(文字列)jUser.get( "loginedTime" ) のSystem.out.println( "ユーザID:" + ID + "? 、それはロックされた" + +ロック"時間の記号" + logintime); } }
結果出力
また、弱く型付けされた言語のフロントエンドは、JAVAは、強く型付けされた言語、文字列の数と明確な区別がある一方で、特定の値を推測するために、そのタイプに応じて可変することができたJavaScript言語です、注意してください。
{「ID」、23}および{「ID」、「23」}遠位差がないが、FastJsonは両方の形式を解決するには、引用符番号として元のキー値(23)が有意に異なります、後者の値は、文字列としてキー(「23」)のために引用されています。
@Test 公共 ボイドparseJsonError() { 文字列メニューリスト = "[{ 'ID' :. 1、 'ロック':falseに、 'loginedTime': '2014年1月21日'}、" '、2:+「{ 'ID'ロック':真、に' loginedTime ':' 2015年3月22日「}]」; JSONArray jUsers = JSONArray.parseArray(メニューリスト); 試み{ ため(オブジェクトuserObj:jUsers) { JSONObjectのjuser =(JSONObject)userObj; / / キャスト、特定の要素のタイプを知ることJSONObject、次いでないエラー 文字列ID =(文字列)jUser.get(「ID」)。// エラー ロックされた文字列 =(文字列)jUser.get( "ロック"); // エラー ストリングlogintime =(文字列)jUser.get( "loginedTime" ) のSystem.out.println( "ユーザID:" + ID +」、 ?ロックまだ時間"+ +ロック"記号:「+ logintime); } } キャッチ(例外E){ e.printStackTrace(); } }
異常なコンソールプロンプト型変換