◆PROCESSING 逆引きリファレンス
カテゴリー:ファイル操作
JSONファイルを読み込むには
【概要】
PROCESSINGでは単純なテキストファイル以外にも、CSV形式のファイルやJSON形式のファイルを扱うことが可能です。
CSV形式のファイルを扱う方法については「CSVファイルを読み込むには」記事を参照してください。
本記事ではJSON形式のファイルを読み込む方法について紹介したいと思います。
JSON とはJavaScript Object Notationの略で、コンピュータ同士が簡単にデータを交換することを目的に制定されたドキュメントフォーマットのことです。
データ交換用のフォーマットはJSON以外にもたくさんありますが、幅広い言語に対応しており、かつ軽量(簡単)で、人間にもコンピュータにも判読しやすい形式でデータを表現できるため、多くの場面で活用されています。
本記事ではJSONについての詳細な説明は割愛しますが、以下のサイト様などが大変参考となります。JSONについて知りたい方は参考とされると良いでしょう。
JSONは(複数の)JSONオブジェクト、または(複数の)JSON配列として表現されます。JSONオブジェクトとJSON配列を組み合わせることも可能です。※
※普通の配列やオブジェクトとJSONで扱う配列やオブジェクトを区別するため、JSONで扱うものをJSON配列、JSONオブジェクトと表現しています。正確な表現ではないことをお断りしておきます。
PROCESSINGには、JSONオブジェクトを読み込む loadJSONObject() 命令と、JSON配列を読み込む loadJSONArray() 命令があります。
読み込んだJSONオブジェクトまたはJSON配列からは、以下の命令で各値を取り出すことが可能です。
№ | 命令 | 用途 |
---|---|---|
1 | getJSONArray | JSON配列を取り出す |
2 | getJSONObject | JSONオブジェクトを取り出す |
3 | getString | 文字列を取り出す |
4 | getBoolean | 真偽値を取り出す |
5 | getDouble / getFloat | 浮動小数点値を取り出す |
6 | getInt / getLong | 整数値を取り出す |
7 | getBooleanArray | 真偽値の配列を取り出す。JSONArrayでのみ利用可能 |
8 | getDoubleArray / getFloatArray | 浮動小数点値の配列を取り出す。JSONArrayでのみ利用可能 |
9 | getIntArray / getLongArray | 整数値の配列を取り出す。JSONArrayでのみ利用可能 |
10 | getStringArray | 文字列の配列を取り出す。JSONArrayでのみ利用可能 |
注意としては、対象となるJSONファイルの文字コードは UTF-8 である必要があることです。
UTF-8以外の文字コードでも読み取ることは可能ですが、取得した値が文字化けするなど予期せぬ現象となりますので注意してください。
また対象となるファイルは、デフォルトでは Data フォルダ配下にあることが前提となります。
【詳細】
JSON配列を読み込む
JSON配列を読み込むJSONArray values = loadJSONArray( String filename ) ;
values : JSON配列
filename : JSONファイル
filename で指定したJSON形式のファイルを読み取ります。該当ファイルはJSON配列([で始まり]で終わる)である必要があります。
ファイルが見つからない場合や、対象となるファイルがJSON配列で始まっていない場合は例外エラーとなります。
以下は簡単な読み取り例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/** * PROCESSING JSON load Sample1 * @auther MSLABO * @version 1.0 2019/01 **/ JSONArray jarray; void setup(){ // JSON配列形式のファイルを読み取る jarray = loadJSONArray("sample.json"); //内容を表示してみる String name = jarray.getString(0); int age = jarray.getInt(1); println( "名前は" + name + " / 年齢は" + age ); } void draw(){ } |
<JSONファイル例>
1 2 3 4 |
[ "太郎", 21 ] |
JSON配列から文字列を取り出す
JSON配列から文字列を取得するString value = jarray.getString(int index) ;
String value = jarray.getString(int index, String def ) ;
String[] values = jarray.getStringArray() ;
value : 文字列
values : 文字列の配列
index : 取り出し位置
def : 取得できない時のデフォルト値
JSON配列から指定した位置にある文字列を取得します。
取り出す値が全て文字列の場合は、getStringArray()で一気に全ての値を文字列配列として取り出すことも可能です。
getString() で文字列を取得する際には、下記サンプルの例2の箇所のように、指定位置に値が存在しない場合のデフォルト値を指定して取り出すことも可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
/** * PROCESSING JSON load Sample3 * @auther MSLABO * @version 1.0 2019/01 **/ JSONArray jarray; void setup(){ // JSON配列形式のファイルを読み取る jarray = loadJSONArray("sample.json"); //JSON配列から文字列を得る 例1 String firstName = jarray.getString(0); println( firstName ); //JSON配列から文字列を得る 例2 String lastName = jarray.getString(5, "なし"); println( lastName ); //JSON配列から文字列配列を得る String[] arrayName = jarray.getStringArray(); for( int i = 0; i < arrayName.length; i++ ){ println( i + ":" + arrayName[i] ); } } void draw(){ } |
<JSONファイル例>
1 2 3 |
[ "青森県","岩手県","宮城県","秋田県","山形県","福島県" ] |
<出力例>
ただしgetStringArray()で全ての値を取得する場合は、該当JSON配列の中に1つでも文字列以外の値が存在すると例外エラーになるので注意してください。
例えば以下のJSONファイルを、getStringArray()で取得すると例外エラーとなります。
例外となるファイル例1:数値が含まれている
1 |
["青森県",100,"福島県"] |
例外となるファイル例2:空の項目が含まれている
1 |
["青森県",,"福島県"] |
JSON配列から真偽値を取り出す
JSON配列から真偽値を取得するboolean value = jarray.getBoolean(int index) ;
boolean value = jarray.getBoolean(int index, boolean def ) ;
boolean [] values = jarray.getBooleanArray() ;
value : 真偽値
values : 真偽値の配列
index : 取り出し位置
def : 取得できない時のデフォルト値
JSON配列から指定した位置にある真偽値を取得します。
取り出す値が全て真偽値の場合は、getBooleanArray()で一気に全ての値を真偽値配列として取り出すことも可能です。
getBoolean() で真偽値を取得する際には、下記サンプルの例2の箇所のように、指定位置に値が存在しない場合のデフォルト値を指定して取り出すことも可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
/** * PROCESSING JSON load Sample4 * @auther MSLABO * @version 1.0 2019/01 **/ JSONArray jarray; void setup(){ // JSON配列形式のファイルを読み取る jarray = loadJSONArray("sample.json"); //JSON配列から真偽値を得る 例1 boolean firstVal = jarray.getBoolean(0); println( firstVal ); //JSON配列から真偽値を得る 例2 boolean lastVal = jarray.getBoolean(4, false); println( lastVal ); //JSON配列から真偽値配列を得る boolean[] arrayVal = jarray.getBooleanArray(); for( int i = 0; i < arrayVal.length; i++ ){ println( i + ":" + arrayVal[i] ); } } void draw(){ } |
<JSONファイル例>
1 2 3 |
[ true,true,false ] |
<出力例>
真偽値は、true か false で定義します。
ただしPROCESSINGの場合は、真偽値を二重引用符で囲ってもOKとみなしてくれるようです。ですので、以下のファイルでも正常に読み込めます。
<JSONファイル例>
1 2 3 |
[ "true","true","false" ] |
ただしgetBooleanArray()で全ての値を取得する場合は、該当JSON配列の中に1つでも真偽値とはみなされない値が存在すると例外エラーになるので注意してください。
例えば以下のJSONファイルを、getBooleanArray()で取得すると例外エラーとなります。
例外となるファイル例1:空文字が含まれている
1 |
[true,"",false] |
例外となるファイル例2:数値が含まれている
1 |
[100,false,false] |
JSONオブジェクトを読み込む
JSONオブジェクトを読み込むJSONObject object = loadJSONObject( String filename ) ;
values : JSONオブジェクト
filename : JSONファイル
filename で指定したJSON形式のファイルを読み取ります。該当ファイルはJSONオブジェクト({で始まり}で終わる)である必要があります。
ファイルが見つからない場合や、対象となるファイルがJSONオブジェクトで始まっていない場合は例外エラーとなります。
以下は簡単な読み取り例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/** * PROCESSING JSON load Sample2 * @auther MSLABO * @version 1.0 2019/01 **/ JSONObject jobject; void setup(){ // JSONオブジェクト形式のファイルを読み取る jobject = loadJSONObject("sample.json"); //内容を表示してみる String name = jobject.getString("Name"); int age = jobject.getInt("Age"); println( "名前は" + name + " / 年齢は" + age ); } void draw(){ } |
<JSONファイル例>
1 2 3 4 |
{ "Name":"太郎", "Age":21 } |
JSONオブジェクトから文字列を読み込む
JSONオブジェクトから文字列を取得するString value = jobject.getString(String key) ;
String value = jobject.getString(String key, String def) ;
value : 取得した文字列
key : KEYとなる値
def: 取得できない場合のデフォルト値
JSONオブジェクトから指定したKEYに合致する文字列を取得します。
getString() で文字列を取得する際には、下記サンプルの例2の箇所のように、指定KEYが存在しない場合のデフォルト値を指定して取り出すことも可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/** * PROCESSING JSON load Sample5 * @auther MSLABO * @version 1.0 2019/01 **/ JSONObject jobject; void setup(){ // JSONオブジェクト形式のファイルを読み取る jobject = loadJSONObject("sample.json"); //JSONオブジェクトから文字列を得る 例1 String val1 = jobject.getString("県名1"); println( val1 ); //JSONオブジェクトから文字列を得る 例2 String val2 = jobject.getString("県名3","該当なし"); println( val2 ); } void draw(){ } |
<JSONファイル例>
1 2 3 4 |
{ "県名1":"青森", "県名2":"秋田" } |
JSONオブジェクトから数値を読み込む
JSONオブジェクトから数値を取得するint value = jobject.getInt(String key) ;
int value = jobject.getInt(String key, int def) ;
value : 取得した値
key : KEYとなる値
def: 取得できない場合のデフォルト値
JSONオブジェクトから指定したKEYに合致する値を取得します。
getInt() で値を取得する際には、下記サンプルの例2の箇所のように、指定KEYで値が取得できない場合のデフォルト値を指定して取り出すことも可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/** * PROCESSING JSON load Sample6 * @auther MSLABO * @version 1.0 2019/01 **/ JSONObject jobject; void setup(){ // JSONオブジェクト形式のファイルを読み取る jobject = loadJSONObject("sample.json"); //JSONオブジェクトから数値を得る 例1 int val1 = jobject.getInt("KEY1"); println( val1 ); //JSONオブジェクトから数値を得る 例2 int val2 = jobject.getInt("KEY2", -1); println( val2 ); } void draw(){ } |
<JSONファイル例>
1 2 3 4 |
{ "KEY1":100, "KEY3":99, } |
【関連記事】
サンプルプログラム
応用例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
/** * PROCESSING JSON load Sample7 * @auther MSLABO * @version 1.0 2019/01 **/ JSONObject jobject; void setup(){ //JSONオブジェクト形式のファイルを読み取る jobject = loadJSONObject("sample.json"); //タイトルを得る String title = jobject.getString("TITLE","*"); println( title ); //県名をJSON配列で得る JSONArray jarray = jobject.getJSONArray("NAME"); //JSON配列を表示する for( int i = 0; i < jarray.size(); i++ ){ String name = jarray.getString(i, "*"); println( i + ":" + name ); } //人口をJSONオブジェクトから得る JSONObject jobject2 = jobject.getJSONObject("人口"); //JSONオブジェクトを表示する for( int i = 0; i < jarray.size(); i++ ){ String key = jarray.getString(i, "*"); float population = jobject2.getFloat(key); println( key + "の人口は約" + population + "万人です" ); } } void draw(){ } |
<JSONファイル例>
1 2 3 4 5 6 |
{ "TITLE":"東北地方", "NAME":["青森県","岩手県","宮城県","秋田県","山形県","福島県"], "人口":{"青森県":138.3,"岩手県":131.8,"宮城県":230.3, "秋田県":108.6,"山形県":116.0,"福島県":199.2} } |
<出力サンプル>
JSONファイルには、JSONオブジェクトとJSON配列を混在させることも可能です。
サンプルのファイルは、全体をJSONオブジェクトで構成し、そのなかに県名をJSON配列で、人口をJSONオブジェクトで配置しています。
実際のビジネスシーンなどでは、もっと複雑な形式のJSONファイルを扱うこともありますが、紹介した命令を組み合わせれば対応できると思います。
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。