Javaは、スマホ向けアプリやWebサービスなどを開発することができます。しかし、実際に開発する場合、クリアしなければならない多くのハードルがあり、その1つがデータ形式の扱いです。
API連携でJSONの活用を考えている方やデータ処理を効率化したい方にとっては、JSONの形式やJavaとの互換性、コードの組み方などは事前に知っておく必要があります。そこで本記事は、JSONをJavaで活用するために、実際のソースコード例を交えつつポイントや注意点を解説します。
目次
1.Javaで使用できるJSONとは
JSONの形式はJavaで使用することができます。以下に、JSONの概要やJavaでの利用目的などを解説します。
JSONの定義
JSON(ジェイソン)とは、「JavaScript Object Notation」の略で、JavaScriptで表記する方法を使ったテキストデータ形式のことです。データ形式とは、データを扱う際のルールを意味しています。例えば、JSONの場合は、テキストのみで構成される記号や配置手順の決まったデータ形式を指します。JSON以外にもデータ形式として「CSV」や「XML」は代表的です。
JavaScriptの表記をベースとしているだけで、特定のプログラミング言語に依存せず、JavaやPythonなどでもJSONが使えます。
JSONの記述方法
JSONは、Javaの配列に近い特徴を持っています。
商品A 10000
商品B 15000
例えば、この商品名と金額の表をデータにするJSON配列の書き方は以下のとおりです。
{"products": [{"name": "商品A","sales": 10000},{"name": "商品B","sales": 15000}]} |
JSONの基本は、「"」(ダブルクオーテーション)で単語(文字)をくくって、それを「,」(カンマ)で区切ります。これを「キー」と「値」に対応する形で1セット毎に外側を「{}」(波括弧)で囲い、全体を「[]」(角括弧)に入れてまとめます。これにより多少複雑なデータでも構造的に記述することができます。
コード文は以上ですが、Javaで利用する場合はそのままコードを組んで入れても動きません。ライブラリを導入することで実行することができます。それについては後ほど説明します。そして、Java以外でも基本は同じ書き方でJSONが使えます。
JavaでJSONを利用する目的
JavaでJSONを使う目的は、Webのデータ交換やアプリケーション開発で使用するデータを扱うためです。JavaScriptはWEBページやWEBアプリケーションの開発に適しており、その良い部分を活用しているのがJSONだからです。そのため、WEBからのデータをやり取りするのにJSONをJavaでも利用しています。
2.JavaでJSONを活用する3つのメリット
以下に、JavaでJSONを活用する3つのメリットを紹介します。
全てのプログラミング言語間で互換性がある
1つ目のメリットは、概ね全てのプログラミング言語で使用できることです。JSONは汎用性が高く、基本全てのプログラミング言語間で互換性があります。特定のプログラミング言語に依存することなく、広く使われているのです。
プログラミング言語同士は、コンパイルしてもすべて互換できるわけではありません。しかし、JSONは別言語のソースコードで組まれたシステム間でも通信時にデータの受け取りや処理がしやすいのです。
読みやすくデータが軽い
2つ目のメリットは、JSONがテキストベースで軽量なデータのため、容易に一時保存やAPIの応答がしやすいことです。また、JSONには「可読性」と呼ばれる特性もあり、人の読みやすさにも優れるなど、扱いやすくて便利なところが選ばれています。
WEBのデータ取得がしやすい
3つ目のメリットはWEBのデータ取得を前提にJSONの処理を組み込めることです。Javaは本来バックエンドの得意なプログラミング言語ですが、JSONを導入することでWEB系アプリケーションのデータを受け取ってフレームワーク・ライブラリ活用するなどフロントエンドを設計・構築しやすくなります。
最近のスマホアプリは、天気アプリや銀行アプリ、SNSアプリ、ECアプリなどWEBから情報を取得してデータ交換をやり取りするものが基本です。そのため、APIを活用してJSONのデータ形式で受け取る場面で使えます。特に、WEBサーバーではAPIからの応答に「JSONでのデータ形式で返す」という特徴があり、それを活用するのにJavaでJSONを使うことはおすすめです。
関連記事
Javaプログラミングで何ができる?始め方や基本文法、練習サイト5つを紹介
3.JavaでJSONを使う方法
先述の通り、Javaのプログラミング言語ではそのままの環境でJSONを使うことはできません。しかし、少しセットアップして環境を整えるだけで、Javaでも使えるようになります。
Jacksonの標準APIにない外部ライブラリ導入
JavaでJSONを使う代表的な方法が独自APIの「Jackson」です。Javaの標準APIにはなく、新規に導入することが必須です。そこで、MavenやGradleを利用している方は、「build.gradle」に対して、Jacksonの外部ライブラリを追加で設定します。
例えば、MavenやGradleのビルドツールの使用者は具体的に以下のような「dependencies」内に外部設定を変更し、最新のバージョン(導入のバージョン)で行います。
Mavenの場合
Mavenの場合は、以下のようにdependencies内の依存関係を追加設定する方法です。Javaのコードを組んでから設定するためには、プロジェクトの「構成」からMavenに変換し、pom.xmlファイルを作成します。そのファイル内のproject直下に以下のコード文を入れます。
<dependencies>
<groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.18.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.18.3</version> </dependency>
<groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.18.3</version> </dependency>
|
Gradleの場合
Gradleでは、下記を「build.gradle」に追加で記載します。このとき、「compile」ではなく「implementation」で記述して設定することがおすすめです。
dependencies {
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.18.3' implementation group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.18.3' } |
ただし、実践的な使用で別ユーザーへのライブラリ提供などを考えている応用目的の方は、以下のように「api」でGradleの依存関係を設定します。
dependencies {
api group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.18.3' api group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.18.3' } |
いずれにしても、「compile」は使用しないことです。これらの方法ならjarファイルを使用せずに設定を完了してJSONを利用できます。
このEclipseで最新バージョンを依存関係に設定する方法は、設定環境やバージョンに合わせることが必要です。個々が手順を確認した後に導入することが求められます。
なぜなら、フレームワーク利用をしている方の中にはそのバージョンの不一致やEclipseのバージョンに依存したエラーで変換のコードが実行できないこともあるからです。
jarファイルを使用する方法
次に、jarファイルを使用する場合は、IDE環境(Eclipseなど)のJacksonセットアップファイル(jarファイル)を3つダウンロードして、ビルドパスからライブラリ、クラスパスの手順で外部jarを追加し、クラスパスの適用が確認できたら完了です。
jackson-core
jackson-annotations
jackson-databind
JavaのインスタンスとJSONパースして相互変換する
JavaでJSONデータを使う場合、Jacksonのライブラリを使ったインスタンスに変換する方法があります。具体的には、JSONデータを受け取り、メインでインスタンスを作成した後、オブジェクトのJSONの文字列を「ObjectMapper.readValue()」で変換する手順です。
インスタンスの作成はnew演算子を使って「ObjectMapper objectMapper = new ObjectMapper();」と記述できます。変換メソッドに引数を入れて、例えば、()内に「jsonData, Book.class(クラス名とクラス拡張子)」を書くことで、JSONデータ形式をJavaのクラスに変換するコード文となります。
{ "title": "Java Programming Basics", "author": "Taro Tanaka", "publishDate": "2022-05-12", "price": 1500 } |
このデータを前提にプログラムを組む流れです。
public class Book { public String title; public String author; public String publishDate; public int price; } |
Bookのクラス名は、取得したJSONデータをクラスにして「ObjectMapper()」メソッドで変換できるようにするためです。取得したデータに合わせたクラスのフィールド型をキーと一致させるように記述します。
import com.fasterxml.jackson.databind.ObjectMapper;
public static void main(String[] args) throws Exception { String json = "{" + "\"title\": \"Java Programming Basics\", " + "\"author\": \"Taro Tanaka\", " + "\"publishDate\": \"2022-05-12\", " + "\"price\": 1500" + "}";
Book book = objectMapper.readValue(json, Book.class);
System.out.println(book.title); System.out.println(book.author); System.out.println(book.publishDate); System.out.println(book.price); } } |
public class Main { public static void main(String[] args) { JsonSample.main(args); } } |
上記では、架空の書籍情報を取得のJSONデータと用意したJavaのクラスをコード文にし、メインメソッドのコードで縦に表示します。
次に、JavaのインスタンスからJSONへと逆に変換する方法です。JSON文字列に変えるための「ObjectMapper.writeValueAsString()」のメソッドを下記のように使用します。
import com.fasterxml.jackson.databind.ObjectMapper;
public static void main(String[] args) throws Exception {
b.title = "Java Programming Basics"; b.author = "Taro Tanaka"; b.publishDate = "2022-05-12"; b.price = 1500;
String json = mapper.writeValueAsString(b);
} } |
上記のソースコード例を出力すると以下のようになります。
{"title":"Java Programming Basics","author":"Taro Tanaka","publishDate":"2022-05-12","price":1500}
結果がJSON文字列のデータ形式(使用記号やキー・値の対応が元のJSONデータと同じ)で正しく返っています。
JavaでJSONファイル読み込みにアノテーションを使用する方法
先の例の他にも、アノテーションを使用した方法もあります。「@JsonProperty」でフィールド名からマッピングして変換が可能です。その基本はアノテーションの記述とjson拡張子ファイルの用意(Eclipseの場合にプロジェクト直下に配置)です。
Bookクラスはフィールド値を取得する「get」や「set」のメソッドを利用します。
import com.fasterxml.jackson.annotation.JsonProperty;
private String title;
private String author;
private String publishDate;
private int price;
public String getTitle() { return title; }
this.title = title; }
return author; }
this.author = author; }
return publishDate; }
this.publishDate = publishDate; }
return price; }
this.price = price; } } |
import java.io.File; import java.io.IOException;
public static void main(String[] args) { try { ObjectMapper objectMapper = new ObjectMapper(); Book book = objectMapper.readValue(new File("book.json"), Book.class); System.out.println("Title: " + book.getTitle()); System.out.println("Author: " + book.getAuthor()); System.out.println("Publish Date: " + book.getPublishDate()); System.out.println("Price: " + book.getPrice());
e.printStackTrace(); } } } |
外側のシステムに影響を与えにくい「get」や「set」のメソッド利用は、内部のシステムを構築するバックエンド開発に向いています。
JavaでJSON文字列のノードを取得変換する方法
今度は、応用的な使い方で、ノードを取得して新たな変更を加えやすくする変換のやり方です。
JsonNode
まずは、「JsonNode」で「ObjectMapper()」メソッドを使用します。下記のソースコード例では、ツリー状にJSONのノードを表示することが可能です。
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper;
public static void main(String[] args) throws Exception {
book.setTitle("Java Programming Basics"); book.setAuthor("Taro Tanaka"); book.setPublishDate("2022-05-12"); book.setPrice(1500);
JsonNode jsonNode = mapper.valueToTree(book);
System.out.println(jsonString); } } |
さらに、上記を応用して「JsonNode.deepCopy」でディープコピーすれば変更を加えることも可能です。その場合、「mapper.readTree()」の次に下記のディープコピーを追加します。
JsonNode copiedNode = originalNode.deepCopy(); ((ObjectNode) originalNode).put("title", "Advanced Java Programming"); |
出力結果も元のノードとコピー後のノードを並べれば違いがわかりやすくなります。
System.out.println("オリジナルのノード: " + originalNode.toString()); System.out.println("コピーしたノード: " + copiedNode.toString()); |
ソースコードに以上の変更を加えた出力結果は、次のとおりです。
Original Node: {"title":"Advanced Java Programming","author":"Taro Tanaka","publishDate":"2022-05-12","price":1500}
Copied Node: {"title":"Java Programming Basics","author":"Taro Tanaka","publishDate":"2022-05-12","price":1500}
ただし、変更を加えたいときは、もう1つのコピー方法「shallowCopy()」(シャローコピー)で参照する仕方は使えません。なぜなら、変更をした際に、参照で同じ地にアクセスするため、元のノードの値も変更してしまうためです。
関連記事
Java標準ライブラリ&外部ライブラリ一覧ガイド|選び方・使い方・作成方法など解説
4.JavaでJSONを活用するときに気をつける点
ここでは、JavaでJSONを活用するときの注意点を取り上げます。
表記方法を守らないとエラーになる
1つ目は、表記方法に十分気をつけることです。1つでも表記が守られていないと、エラーが発生して実行することはできません。よくある例として、「"」が「'」で1つだったり、「{}」が普通の括弧「()」に変わっているなどです。データの対応もキーと値のセットが対応せず、ズレているなども表記ミスでエラーが起こります。
構造を複雑にしない
2つ目は、JSONを表記するために、階層を深くしすぎたり、多くのデータを扱ったりする場合に、処理負担が増えることです。メモリ容量のヒープサイズ最大値を超過して、処理が重くなる、時間がかかるといった原因となります。
できるだけシンプルで負担のかからないデータを取得できるように、データの取得とその階層・データ数の設計を考える必要があります。
5.JavaでJSONを活用する際のよくある質問
ここではJavaでJSONを活用するときに疑問となりやすいよくある質問にそれぞれ回答します。
JSONを使わなくてもデータを扱えるのになぜjson型データを無理に扱う?
確かにJSONを使わずにデータは扱えますが、WEBのデータ取得はJSONのデータ形式で受け取るため、それを処理できる設計が必要となります。
また、Javaのデータは、他のプログラミング言語で受け取る際に、互換性がないことが多いため、さまざまな問題が発生します。データのやり取りをスムーズにするためにも、JSONの活用が有効です。
JavaはJSON変換コードがあればWEB表示もできるのか?
いいえ、JSONデータをJavaで変換するコードを組んでも、WEBアプリケーションでそのまま実行して使えるわけではありません。しかし、「Spring Boot」などの簡易フレームワークを使用して、Webサーバーを組み込み、設定をするだけで実行確認ができます。WEB開発を前提とする方は、追加でフレームワークの導入を検討しましょう。
Java環境は整っているにもかかわらず、コードが実行できない理由は?
JSONは、本来Javaの標準APIに用意されていない外部ライブラリを必要とします。そのため、「Jackson」や「org.json」などライブラリの導入が前提となります。
紹介したソースコード例はどれも「Jackson」ライブラリがすでに入っていることを前提としているため、導入前の環境ではエラーしかでません。先に外部ライブラリのインストールが必要です。
関連記事
【Javaアプリ開発|初心者必見】手順やおすすめの練習方法を教えます!効率化の手段やアプリ例も解説!
6.まとめ
今回は、JSONの概要やJavaでJSONを活用する方法などを解説しました。JSONは元がWEBブラウザで動くJavaScriptのデータ形式を活用しており、Javaでもライブラリを導入してデータを扱うことができます。
プログラミング言語に縛られず、WEBデータ取得に優れており、WEBデータを取得するスマホアプリやWEB系システムには欠かせない形式です。
今回挙げたソースコード例や方法、注意点を参考に、JavaでJSONを使ってプログラムの幅を広げましょう。
本記事が皆様にとって少しでもお役に立てますと幸いです。
「フリーランスボード」は、数多くのフリーランスエージェントが掲載するITフリーランスエンジニア・ITフリーランス向けの案件・求人を一括検索できるサイトです。
開発環境、職種、単価、稼働形態、稼働日数など様々な条件から、あなたに最適なフリーランス案件・求人を簡単に見つけることができます。
単価アップを目指す方や、自分の得意なスキルを活かせる案件に参画したい方は、ぜひ「フリーランスボード」をご利用ください。