これは私の最初の投稿です。新進の Android 開発者として、私はさまざまなトピックに関する SO の投稿をほぼ毎日読んでいますが、この質問については、Google や SO からの助けは見つかりませんでした。
これまでの調査:
この質問の検索は通常より困難でした。検索エンジンは、この問題では重要な大文字と小文字の区別を気にしていないようです。Google で検索すると、クラス自体へのリンク、古い記事、またはまったく関係のない記事しか表示されませんでした。最も近いのは JSONArray と JSONObject でしたが、これはまったく別の質問です。SO で検索しても同じ結果になりました。私が知る限り、SO のすべての関連投稿は、JsonObject ではなく JSONObject を参照しています。
Oracle や json.org のドキュメントでは、その反対側については言及されていませんでした。また、org.json ライブラリを使用する Android 開発者の JSONObject ページでも言及されていませんでした。
java.util.JsonObject は、Java EE 7 でサポートされています。
http://www.json.org/javadoc/org/json/JSONObject.html
JSONObject の Android リファレンス ページへのリンクも投稿したかったのですが、初心者としての私の評判が低すぎます。
問題の履歴: Oracle のページで Json のエンコードとデコードについて読んでいて、AndriodStudio IDE にコピーして貼り付けようとしたところ、すぐにエラーが発生し、通常表示されるようなインポート ステートメントが提案されませんでした。これは、クラスが組み込みライブラリの一部ではないことを意味することがわかりました。
問題は、貼り付けたコードが JsonObject (javax.json ライブラリから取得) を使用していて、JSONObject (org.json ライブラリから取得) を使用していなかったことです。Android ページと Oracle ページのケースの違いに気づいたので、コードを Json から JSON に変更したところ、すぐに IDE が org.json インポート ステートメントを提供しました。
質問: 外部ライブラリはデフォルト ライブラリの一部であるのに、Oracle 製のクラスがデフォルト ライブラリの一部でないのはなぜですか?
JSON は古い非推奨の方法であり、Json は新しい適切な方法ですか?
これらは機能的に同一ですか? そうでない場合は、例を挙げてください。
状況によっては、どちらか一方が適していて、もう一方の方が適している場合もありますか?
最終的に、どちらを使用すべきですか? また、その理由はなぜですか (まだ説明されていない場合)?
javax.json の場合、そのライブラリをダウンロードする最適な (最も安全な) 場所はどこですか?
ベストアンサー1
少し遅くなりましたが、これについて私の意見を共有したいと思います。
最近、両方のライブラリが同時に使用されている Java プロジェクトを見つけたときに、この問題に直面しました。
org.json
2 つの主な理由 (私のニーズ) から、読みやすく使いやすいと思います。
JsonObject は不変です。既存の JsonObject に新しいキー/値のペアを追加することはできません (こちらを参照:javax.json: 既存の JsonObject に新しい JsonNumber を追加する)
JsonObject または JsonArray をきれいに印刷するには数行かかりますが、JSONObject または JSONArray の場合は 1 行しかかかりません。例:
StringWriter sw = new StringWriter(); Map<String, Object> properties = new HashMap<>(); properties.put(JsonGenerator.PRETTY_PRINTING, true); JsonWriterFactory writerFactory = Json.createWriterFactory(properties); JsonWriter jsonWriter = writerFactory.createWriter(sw); jsonWriter.writeObject(jsonObject); //JsonObject created before jsonWriter.close(); String prettyPrintedJSON = sw.toString();
これは、インデントされた JSON を取得してファイルに書き込むために使用するコードです。org.json では、必要なのは だけですjsonObject.toString(4)
。
もう 1 つの違いはコンストラクターです。JsonObjectBuilder
を使用して JSON を作成するには、が必要ですjavax.json
。回避できる手順が 1 つ増えます。
JsonObject
他にも違いはあると思います (文字列から を作成できるかどうかはわかりません) が、これが私の考えです。