◆PROCESSING 逆引きリファレンス
 カテゴリー:ファイル操作
 カテゴリー:ファイル操作
JSONファイルを書き出すには
【概要】
PROCESSINGでは単純なテキストファイル以外にも、CSV形式のファイルやJSON形式のファイルを扱うことが可能です。
本記事ではJSON形式のファイルを書き出す方法について紹介したいと思います。JSON形式のファイルから値を取得する方法については「JSONファイルを読み込むには」記事を参照してください。
JSONは(複数の)JSONオブジェクト、または(複数の)JSON配列として表現されます。JSONオブジェクトとJSON配列を組み合わせることも可能です。※
※普通の配列やオブジェクトとJSONで扱う配列やオブジェクトを区別するため、JSONで扱うものをJSON配列、JSONオブジェクトと表現しています。正確な表現ではないことをお断りしておきます。
PROCESSINGにはJSONオブジェクトを扱うJSONObjectクラスと、JSON配列を扱うJSONArrayクラスがあり、それぞれに値を追加してファイルに保存する事が可能です。
| № | 命令 | 用途 | 
|---|---|---|
| 1 | setString() | 文字列を追加します | 
| 2 | setInt() | 整数を追加します | 
| 3 | setFloat() | 浮動小数点数を追加します | 
| 4 | setBoolean() | 真偽値を追加します | 
| 5 | setJSONArray() | JSON配列を追加します | 
| 6 | setJSONObject() | JSONオブジェクトを追加します | 
| 7 | append() | 文字列、整数、真偽値、符号小数点、JSON配列、JSONオブジェクトを追加します。JSON配列でのみ利用可能です | 
| 8 | remove() | 項目を削除します。JSON配列でのみ利用可能です | 
上記命令で値を操作したJSONオブジェクトまたはJSON配列は、saveJSONObject()命令、またはsaveJSONArray()命令でファイルに保存可能です。
注意としては、保存されるJSONファイルの文字コードは UTF-8 となる事です。
またファイルにパスを指定しなかった場合は、デフォルトでは スケッチファイルと同じフォルダ(Dataフォルダ配下ではない)にファイルが作成されます。
【詳細】
JSON配列を作成する
jarray : 作成したJSON配列インスタンス
JSON配列は JSONArray クラスを new すれば作成する事が可能です。簡単ですね。
JSON配列に文字列をセットする
jarray : JSON配列インスタンス
index : セットする位置
add : セットする文字列
new で作成したJSON配列の指定位置に、文字列をセットします。JSON配列の先頭にセットする場合は、セットする位置(index)は 0 となります。
セットする位置は 0 から始めなくてもエラーにはなりません。また飛び番(0,1,3など)もOKですが、その場合は該当位置にJSONのnull値(null)がセットされます。
また戻り値がJSONArrayなので、連続して命令を記述する事も可能です(下記の例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 | /**  * PROCESSING JSON load Sample1  * @auther MSLABO  * @version 1.0 2019/01  **/ JSONArray  jarray; void setup(){   //JSON配列を作成する   jarray = new JSONArray();   //文字列をセットする   jarray.setString(1,"1番の文字列");     jarray.setString(3,"3番の文字列");   // こんなふうにも記述できる(例2)   jarray.setString(4,"4番の文字列")         .setString(5,"5番の文字列");   //ファイルに書き出す   saveJSONArray( jarray, "test.json"); } void draw(){ } | 
<作成されたJSONファイル例>
| 1 2 3 4 5 6 7 8 | [   null,   "1番の文字列",   null,   "3番の文字列",   "4番の文字列",   "5番の文字列" ] | 
上記例では index を 1 から始めているため、先頭に null値がセットされています。
同じように1の次に2を指定せずに3を指定しているため、1番の文字列と3番の文字列の間にも null値が入っています。
たくさんの文字列を連続でセットしたい場合は、上記サンプルの例2のように記述することも可能です。
JSON配列に整数をセットする
jarray : JSON配列インスタンス
index : セットする位置
add : セットする整数
new で作成したJSON配列の指定位置に、整数をセットします。JSON配列の先頭にセットする場合は、セットする位置(index)は 0 となります。
セットする位置は 0 から始めなくてもエラーにはなりません。また飛び番(0,1,3など)もOKですが、その場合は該当位置にJSONのnull値(null)がセットされます。
また戻り値がJSONArrayなので、連続して命令を記述する事も可能です(下記の例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 | /**  * PROCESSING JSON load Sample2  * @auther MSLABO  * @version 1.0 2019/01  **/ JSONArray  jarray; void setup(){   //JSON配列を作成する   jarray = new JSONArray();   //整数をセットする   jarray.setInt(0,0);     jarray.setInt(2,2);   // こんなふうにも記述できる(例2)   jarray.setInt(3,3)         .setInt(4,4);   //ファイルに書き出す   saveJSONArray( jarray, "test.json"); } void draw(){ } | 
<作成されたJSONファイル例>
| 1 2 3 4 5 6 7 | [   0,   null,   2,   3,   4 ] | 
上記例では index の 1 を飛ばして指定しているため、該当位置に null値がセットされています。
たくさんの値を連続でセットしたい場合は、上記サンプルの例2のように記述することも可能です。
JSON配列に浮動小数点値をセットする
JSONArray jarray = jarray . setDouble( int index, double dadd ) ;
jarray : JSON配列インスタンス
index : セットする位置
fadd / dadd : セットする浮動小数点値
new で作成したJSON配列の指定位置に、浮動小数点値をセットします。JSON配列の先頭にセットする場合は、セットする位置(index)は 0 となります。
セットする位置は 0 から始めなくてもエラーにはなりません。また飛び番(0,1,3など)もOKですが、その場合は該当位置にJSONのnull値(null)がセットされます。
また戻り値がJSONArrayなので、連続して命令を記述する事も可能です(下記の例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 | /**  * PROCESSING JSON load Sample3  * @auther MSLABO  * @version 1.0 2019/01  **/ JSONArray  jarray; void setup(){   //JSON配列を作成する   jarray = new JSONArray();   //浮動小数点値をセットする   jarray.setFloat(0,0.0);     jarray.setDouble(2,2.000);   // こんなふうにも記述できる(例2)   jarray.setFloat(3,3.14)         .setDouble(4,4.999);   //ファイルに書き出す   saveJSONArray( jarray, "test.json"); } void draw(){ } | 
<作成されたJSONファイル例>
| 1 2 3 4 5 6 7 | [   0,   null,   2,   3.140000104904175,   4.999000072479248 ] | 
上記例では index の 1 を飛ばして指定しているため、該当位置に null値がセットされています。
たくさんの値を連続でセットしたい場合は、上記サンプルの例2のように記述することも可能です。
注意としては float や double などの浮動小数点は誤差が発生する事です。
例えば上記サンプルでは “3.14”、”4.999” という値をセットしていますが、実際のファイルでは誤差を伴った値で記述されています。
JSON配列に値を追加する
JSONArray jarray = jarray . append( int add ) ;
JSONArray jarray = jarray . append( float add ) ;
JSONArray jarray = jarray . append( boolean add ) ;
JSONArray jarray = jarray . append( JSONArray add ) ;
JSONArray jarray = jarray . append( JSONObject add ) ;
jarray : JSON配列インスタンス
add : セットする値(String, int, float, boolean, JSONArray, JSONObject )
new で作成したJSON配列に、各値をセットします。append() 命令は現在の配列の最後尾から指定された値を自動追加していきます。
また戻り値がJSONArrayなので、連続して命令を記述する事も可能です。
| 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 | /**  * PROCESSING JSON load Sample4  * @auther MSLABO  * @version 1.0 2019/01  **/ JSONArray  jarray; void setup(){   //JSON配列を作成する   jarray = new JSONArray();   //先頭に文字列をセットする   jarray.setString( 0, "先頭だよ" );   //上記に続けて、各値を追加する   jarray.append("文字列を追加")         .append(3.14)         .append(false);   //ファイルに書き出す   saveJSONArray( jarray, "test.json"); } void draw(){ } | 
<作成されたJSONファイル例>
| 1 2 3 4 5 6 | [   "先頭だよ",   "文字列を追加",   3.140000104904175,   false ] | 
double型の値は利用できませんが、値を連続でセットしたい場合は 、それぞれの型に応じた set命令を使うよりは append() 命令を使うほうが便利ですね。
JSON配列から値を削除する
jarray : JSON配列インスタンス
index : 削除する位置
値がセットされたJSON配列の指定位置から、値を削除して前詰めします。
指定された位置に配列が存在しないと例外エラーとなるので注意してください。
| 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 | /**  * PROCESSING JSON load Sample5  * @auther MSLABO  * @version 1.0 2019/01  **/ JSONArray  jarray; void setup(){   //JSON配列を作成する   jarray = new JSONArray();   //文字列をセットする   jarray.setString( 0, "先頭だよ" );   jarray.setString( 1, "1番目だよ" );   jarray.setString( 2, "2番目だよ" );   //1番目("1番目だよ"という文字列)を削除する   jarray.remove( 1 );   //ファイルに書き出す   saveJSONArray( jarray, "test.json"); } void draw(){ } | 
<作成されたJSONファイル例>
| 1 2 3 4 | [   "先頭だよ",   "2番目だよ" ] | 
上記例では、最初に
[ 0 ]:”先頭だよ”
[ 1 ]:”1番目だよ”
[ 2 ]:”2番目だよ”
という構造のJSON配列を作成し、この1番目(”1番目だよ”という値)を削除しています。
よって結果は
[ 0 ]:”先頭だよ”
[ 1 ]:”2番目だよ”
となります。
削除された結果、もともと2番目にあった “2番目だよ” という値の順番が前詰めされて1番目の項目になる事に注意してください。
JSON配列をファイルに書き込む
boolean ret = saveJSONArray( JSONArray jarray, String filename, String option) ;
ret : 戻り値(false = 失敗)
jarray : 書き込むJSON配列
filename : ファイル名
option : オプション。”indent=N” か “compact” を指定。OPTIONは省略可能で N は 0以上の数字文字(例:”indent=4″)
値をセットしたJSON配列をファイルに書き込みます。
filenameにパスを指定しなかった場合、スケッチと同一フォルダ(Dataフォルダ配下ではない)にファイルが作成されます。
ファイルの文字コードはUTF-8になる事に注意してください。また同名のファイルがある場合は上書き更新される事にも注意が必要です。
| 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 | /**  * PROCESSING JSON load Sample8  * @auther MSLABO  * @version 1.0 2019/01  **/ JSONArray  jarray; void setup(){   //JSON配列を作成する   jarray = new JSONArray();   //項目をセットする   jarray.append("ヨシヒコ")         .append("キキ");   //ファイルに書き出す   saveJSONArray( jarray, "test.json");   //インデントを指定する   saveJSONArray( jarray, "indent.json", "indent=4");   //compactを指定する   saveJSONArray( jarray, "compact.json", "compact"); } void draw(){ } | 
<作成されたJSONファイル例>
| 1 2 3 4 | [   "ヨシヒコ",   "キキ" ] | 
OPTIONは省略可能です。省略すると “indent=2” が指定されたものとして動作するようです。
indent指定は、各項目の前に指定した数の半角スペースをつけます。作成したファイルを人間が読む場合は、可読性を上げるために適切に指定すると良いでしょう。
一方で作成したファイルをコンピュータだけで処理する場合は、可読性を犠牲にしてファイルサイズを小さくする目的で compact 指定をする事も可能です。
compact を指定すると、項目に余分なスペースや改行をつけないで書き出します。
以下は上記サンプルで出力したファイルをサクラエディタで開いた様子です。

JSONオブジェクトを作成する
jobject : 作成したJSONオブジェクトインスタンス
JSONオブジェクトは JSONObjectクラスを new すれば作成する事が可能です。簡単ですね。
JSONオブジェクトに文字列をセットする
jobject : 作成したJSONオブジェクトインスタンス
key : キー文字列
value : セットする文字列
new で作成したJSONオブジェクトに、KEYとペアになった文字列をセットします
| 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 | /**  * PROCESSING JSON load Sample6  * @auther MSLABO  * @version 1.0 2019/01  **/ JSONObject  jobject; void setup(){   //JSONオブジェクトを作成する   jobject = new JSONObject();   //文字列をセットする   jobject.setString( "勇者", "ヨシヒコ" );   jobject.setString( "僧侶", "空海" );   jobject.setString( "魔女", "キキ" );   //[僧侶] 項目をを削除する   jobject.setString( "僧侶", null );   //ファイルに書き出す   saveJSONObject( jobject, "test.json"); } void draw(){ } | 
<作成されたJSONファイル例>
| 1 2 3 4 | {   "勇者": "ヨシヒコ",   "魔女": "キキ" } | 
一度セットした項目を削除したい場合は、削除したい項目のKEYに null をセットします。
上記サンプルなら、「僧侶」というKEYをもつ項目に null をセットしていますので、「空海」という値は書き込み対象外となります。
またオブジェクトのファイルへのセットは順番通り行われる保証がない事にも注意してください。上記では、たまたま “勇者” のあとに “魔女” の項目が出来上がっていますが、この順番が逆転する事もあります。
オブジェクトへのアクセスはKEYで行われるため、ファイル上の順番は保証されないのですね。
JSONオブジェクトに浮動小数点値をセットする
JSONObject jobject = jobject.setDouble( String key, double dvalue) ;
jobject : 作成したJSONオブジェクトインスタンス
key : キー文字列
fvalue / dvalue : セットする浮動小数点値
new で作成したJSONオブジェクトに、KEYとペアになった浮動小数点値をセットします
| 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 | /**  * PROCESSING JSON load Sample7  * @auther MSLABO  * @version 1.0 2019/01  **/ JSONObject  jobject; void setup(){   //JSONオブジェクトを作成する   jobject = new JSONObject();   //浮動小数点値をセットする   jobject.setFloat( "円周率", 3.14 )          .setFloat( "身長"  , 171.2);            jobject.setDouble("体重"  , 64.3);   jobject.setDouble("月齢"  , 336.5);   //[体重] 項目を削除する   jobject.setString( "体重", null );   //ファイルに書き出す   saveJSONObject( jobject, "test.json"); } void draw(){ } | 
<作成されたJSONファイル例>
| 1 2 3 4 5 | {   "月齢": 336.5,   "円周率": 3.140000104904175,   "身長": 171.1999969482422 } | 
一度セットした項目を削除したい場合は、削除したい項目のKEYに null をセットします。
上記サンプルなら、「体重」というKEYをもつ項目に null をセットしていますので、「64.3」という値は書き込み対象外となります。
注意としては float や double などの浮動小数点は誤差が発生する事です。
またsetDouble()やsetFloat()で値に null を指定することはできません。値を削除したい場合は setString() を利用してください。
JSONオブジェクトをファイルに書き込む
boolean ret = saveJSONObject( JSONObject jobject, String filename, String option) ;
ret : 戻り値(false = 失敗)
jobject : 書き込むJSONオブジェクト
filename : ファイル名
option : オプション。”indent=N” か “compact” を指定。OPTIONは省略可能で N は 0以上の数字文字(例:”indent=4″)
値をセットしたJSONオブジェクトをファイルに書き込みます。
filenameにパスを指定しなかった場合、スケッチと同一フォルダ(Dataフォルダ配下ではない)にファイルが作成されます。
ファイルの文字コードはUTF-8になる事に注意してください。また同名のファイルがある場合は上書き更新される事にも注意が必要です。
| 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 | /**  * PROCESSING JSON load Sample9  * @auther MSLABO  * @version 1.0 2019/01  **/ JSONObject  jobject; void setup(){   //JSON配列を作成する   jobject = new JSONObject();   //項目をセットする   jobject.setString("勇者","ヨシヒコ")          .setString("魔女","キキ");     //ファイルに書き出す   saveJSONObject( jobject, "test.json");   //インデントを指定する   saveJSONObject( jobject, "indent.json", "indent=4");   //compactを指定する   saveJSONObject( jobject, "compact.json", "compact"); } void draw(){ } | 
<作成されたJSONファイル例>
| 1 2 3 4 | {   "勇者": "ヨシヒコ",   "魔女": "キキ" } | 
OPTIONは省略可能です。省略すると “indent=2” が指定されたものとして動作するようです。
indent指定は、各項目の前に指定した数の半角スペースをつけます。作成したファイルを人間が読む場合は、可読性を上げるために適切に指定すると良いでしょう。
一方で作成したファイルをコンピュータだけで処理する場合は、可読性を犠牲にしてファイルサイズを小さくする目的で compact 指定をする事も可能です。
compact を指定すると、項目に余分なスペースや改行をつけないで書き出します。
以下は上記サンプルで出力したファイルをサクラエディタで開いた様子です。
【関連記事】
サンプルプログラム
応用例:
| 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 | /**  * PROCESSING JSON load Sample10  * @auther MSLABO  * @version 1.0 2019/01  **/ JSONObject  jobjBase; void setup(){   //ベースとなるJSONオブジェクトを作成する   jobjBase = new JSONObject();   //JSONオブジェクト(子)を作成する   JSONObject jobject = new JSONObject();   jobject.setString("名前", "ヨシヒコ");   //JSONオブジェクト(子)をベースにセットする   jobjBase.setJSONObject("勇者",jobject);   //JSON配列(子)を作成する   JSONArray jarray = new JSONArray();   jarray.append("ひのきの棒")         .append("皮の鎧")         .append("冒険者の服")         .append("勇者の印");   //JSON配列(子)をベースにセットする   jobjBase.setJSONArray("ヨシヒコ",jarray);   //ファイルに書き出す   saveJSONObject( jobjBase, "test.json"); } void draw(){ } | 
JSONオブジェクトとJSON配列は混在させることも可能です。
上記例ではベースとなるJSONオブジェクトに子供となるJSONオブジェクトとJSON配列を追加して書き込んでいます。
実際のビジネスシーンでは、もっと複雑なJSONファイルを作成する事もあるかとは思いますが、紹介した命令を組み合わせれば対応できると思います。
<作成されたJSONファイル例>
| 1 2 3 4 5 6 7 8 9 | {   "勇者": {"名前": "ヨシヒコ"},   "ヨシヒコ": [     "ひのきの棒",     "皮の鎧",     "冒険者の服",     "勇者の印"   ] } | 
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。
