平たく言えば、Jackson は JSON 形式のデータを処理するための Java クラス ライブラリであり、そのパフォーマンスは非常に優れています。この記事では、Jackson の使用法のより詳細な分析例を示します。詳細は以下のとおりです。
1. はじめに
テストによると、どのような形式の変換でも、Jackson > Gson > Json-lib と比較的高いシリアル化と逆シリアル化の効率があり、Jackson の処理能力は Json-lib の 10 倍近くも高く、それも正解です。とても高い。対照的に、Json-lib は更新を停止しているようで、最新バージョンも JDK15 ベースになっていますが、Jackson コミュニティはより活発です。
以下にJacksonの使い方を例文とともに簡単に紹介します。
2. 使用する
Jackson は多くのクラスとメソッドを提供しており、シリアル化と逆シリアル化で最も一般的に使用されるクラスは ObjectMapper クラスです。これは、Json-lib の JsonObject および ArrayObject に似ています。このクラスは、変換用の readTree()、readValue()、writeValueAsString() などのメソッドを提供します。このクラスの具体的なドキュメントのアドレスは、http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html です。
繰り返しの説明を避けるため、以下で説明する objectMapper はすべて ObjectMapper objectMapper = new ObjectMapper() から来ています。以下にシリアル化とデシリアル化の観点から使い方を簡単に紹介します。
1.連載
① Java 独自のクラスをシリアライズする
テスト例
リスト list=new ArrayList();list.add(1);list.add(2);list.add(3);
シリアル化を実装します。
文字列 teststringlist=objectMapper.writeValueAsString(list);System.out.println(teststringlist);
コンソールに出力される結果は次のとおりです。
[1,2,3]
結論は:
Jackson は、一般的な型のシリアル化を簡単に実装できます。
②カスタムクラスのシリアライズ
テスト例:
public クラスの学生 {private int age=10;private String name="hh"; public String[] list={"hao","haouhao","keyi"}; public Date time=new Date(); () { 年齢を返す; } public void setAge(int age) { this.age = 年齢; } public String getName() { return name; } public void setName(String name); }}
例をより一般化するために、このクラスには値型 int、参照型 String、String[]、および日付型 Date が含まれています。
シリアル化を実装する
Student st=new Student();String teststringstu=objectMapper.writeValueAsString(st);System.out.println(teststringstu);
コンソールに出力される結果は次のとおりです。
{"リスト":["ハオ","ハオウハオ","キーイ"],"時間":1375429228382,"名前":"ああ","年齢":10}
結論は:
出力から、変換された Json 文字列が形式に準拠していることがわかります。ただし、時間の表現は少し標準以下です。時刻形式の変更点を以下に紹介します。
③時刻フォーマットの定義
Jackson にはタイムスタンプの形式である独自のデフォルトの時刻形式があり、その効果は上記の結果に示されているとおりです (例: 1375429228382)。この形式を無効に設定したい場合は、次のように渡します。
objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false)
時刻生成でいわゆる [ISO-8601 ] 準拠の表記法を使用し、「1970-01-01T00:00:00.000+0000」のような形式で時刻を出力するように設定できます。
もちろん、出力時刻形式をカスタマイズすることもできます。
カスタム時刻形式の実装
この例では、上で紹介した Student クラスも使用しています。
Student st=new Student();java.text.DateFormat myFormat = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");objectMapper.getSerializationConfig().setDateFormat(myFormat);String teststringstu= objectMapper.writeValueAsString(st);System.out.println(teststringstu);
コンソール上のデメリットの出力は次のとおりです。
{"リスト":["ハオ","ハオウハオ","キーイ"],"時刻":"2013-08-02 03:48:20","名前":"ああ","年齢":10}
結論は:
時刻の出力形式が希望どおりになっていることがわかります。 Jackson で時刻出力形式を定義する方法は、Json-lib で時刻形式を定義するよりもはるかに簡単です。
④別のシリアル化方法
シリアル化を実装する
使用されている例は、依然として前の学生クラスです。
学生 st=新しい学生();JsonGenerator jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(System.out, JsonEncoding.UTF8);jsonGenerator.writeObject(st);
コンソール上の出力は次のとおりです。
{"リスト":["ハオ","ハオウハオ","キーイ"],"時間":1375429228382,"名前":"ああ","年齢":10}
結論は:
このメソッドでも上記メソッドの値を取得できます。ただし、このメソッドの関数 createJsonGenerator() に注意してください。この関数には 2 つのパラメーターが必要です。1 つは OutputStream 型パラメーター、もう 1 つは JsonEncoding 型パラメーターです。これら 2 つのパラメーターから、このメソッドは Json をネットワーク ストリームに直接書き込むだけでなく、ファイル ストリームまたはメモリ ストリームにも Json を書き込むことができることがわかります。したがって、より多用途です。
2. デシリアライゼーション
①ワンタイムデシリアライズ
このメソッドは主に、ObjectMapper が提供する <testJsonClass> readValue(String content, Class<testJsonClass> valueType) メソッドを使用します。このメソッドは、Json 文字列と、入力する必要があるクラスの対応するクラスを入力する必要があり、入力されたクラスを返します。
Json文字列をカスタムクラスに解析します
Json文字列が次の場合:
文字列 test1="{"objectID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.9150390625}]}"
時間。
まずクラスを定義します。
public class testJsonClass { public int objectID; public List geoPoints=new ArrayList();}
次に、次のコード スニペットを使用して、Json をこのクラスに逆シリアル化します。
testJsonClass testClass= objectMapper.readValue(test1, testJsonClass.class);
使用
System.out.println(testClass.objectID);System.out.println(testClass.geoPoints)
コンソールに出力として表示される値は次のとおりです。
357[{x=504604.59802246094, y=305569.9150390625}]
Json 文字列がシステム独自のクラスにデシリアライズされる場合。
文字列json = "{"エラー":0,"データ":{"名前":"ABC","年齢":20,"電話":{"自宅":"abc","モバイル":"def"},"友達":[{"名前":"DEF","電話" :{"ホーム":"hij"、"モバイル":"klm"}}、{"名前":"GHI"、"電話":{"ホーム":"nop"、"モバイル":"qrs"} }]},"その他":{"ニックネーム":[]}}"。
システム独自のマップ (Map<String, Map<String, Object>> マップ) を使用して変数を定義します。次に、maps = objectMapper.readValue(json, Map.class) を使用して、Json を変数マップに逆シリアル化します。
合格
System.out.println(maps.get("error"));System.out.println((Object)(maps.get("data").get("phone")))
コンソールで次の結果を取得できます。
0{ホーム=abc、モバイル=def}
②段階的なデシリアライズ
この方法はより柔軟で、ユーザーが関心のある Json 文字列情報値のみを抽出できます。主に ObjectMapper が提供する readTree と Jackson が提供する JsonNode クラスを使用して実装されます。
テスト例
弦test="{"結果":[{"オブジェクトID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.915039 0625}]},{"オブジェクトID":358,"地理ポイント":[{"x":504602.2680053711,"y":305554.43603515625}]}]}";
この Json 文字列は、ネストされた配列の形式を含む比較的複雑であり、汎用的です。
逆シリアル化の実装
JsonNode node= objectMapper.readTree(test); // Json 文字列をツリー構造でメモリに読み込みます JsonNode content=node.get("results");// 結果ノードの下の情報を取得します for(int i=0) ; i<コンテンツ.サイズ();i++) //結果の下の情報を走査すると、size() 関数は、配列の長さと同様に、ノードに含まれる情報の数を取得できます {System.out.println(contents.get(i).get("objectID" ). getIntValue()); // ノードの下の子ノードの値を読み取ります。 geoNumber=contents.get(i).get("geoPoints");for(int j=0;j<geoNumber.size();j++) //子ノードの下の情報をループします {System.out.println(geoNumber.get(j).get("x").getDoubleValue()+" " +geoNumber.get(j).get("y").getDoubleValue());}}
コンソール上の出力は次のとおりです。
357504604.59802246094 305569.9150390625358504602.2680053711 305554.43603515625
結論は:
この方法は、XML 解析における DOM 解析に似ており、構造が詳細であるため、必要な情報を抽出しやすいという利点があります。もちろん、欠点はこの方法と同じで、時間とスペースがかかります。
3. まとめ
Json に対する Jackson の操作は主に上記のとおりであり、そのメソッドは非常に使いやすく、ワンタイムの操作とオンデマンドで情報を読み取ることができる操作を提供します。また、Jackson には、アノテーション機能、Hibernate 用の遅延挿入機能、時刻フォーマットの設定機能など、さまざまな詳細なシリアル化と逆シリアル化を制御できる機能が充実しています。これらの機能は現時点では必要ありませんので、よく検討してください。後で。同時に、Jackson は XML での一連のシリアル化および逆シリアル化操作もサポートしています。その考え方は Json の解析とほぼ同じです。
Jackson の現在の欠点に関して、インターネット上の一部の人々は、Jackson が Json-lib よりも多くのメモリを消費することをテストしました。スペースを時間のために使うことには、一般的に価値があります。