🗂

プログラミング自主学習 DAY82 ObjectI/OSteam/JSON

2023/08/17に公開

ObjectI/OStream

Serializable

メモリのオブジェクトデーターをファイルもしくはネットワークに出力するためのストリームです。
その過程で、オブジェクトのデーターはbyte[] に変換されますが、データーをまるで人を並んでるように配列にデーターを入れますので、シリアライズ(直列化) と表現します。
反対にオブジェクトデーターをメモリに乗せるため、オブジェクトに変換することをデシリアライズ(逆直接化) といいます。

ObjectInputStream ois = new ObjectInputStream(InputStream is)
ObjectOutputStream oos = new ObjectOutputStream(OutputStream os)

しかし、全てのオブジェクトが出力できれば、データーの流出で問題になることは当たり前です。外部に出力しても良いクラスのオブジェクトを決めたい場合、クラスはSerializable Interfaceを具象する必要があります。

serialVersionUID

Networkを通して、他のPCにオブジェクトをデシリアライズするとしましょう。

PC1

Member
public class Member implements Serializable{
int field1;
int field2;
}

PC2

Member
public class Member implements Serializable{
int field1;
int field2;
int field3;
}

この場合は、同じクラス名だとしてもクラスの内容が異なるため、デシリアライズができない。
そのため、活用することがserialVersionUIDという固有ナンバーです。
serialVersionUIDは、Eclipseあるいは、javaのserialver.exeを通して生成されます。

PC1

Member
public class Member implements Serializable{
static final long serialVersionID = 148808887655480L;
int field1;
int field2;
}

PC2

Member
public class Member implements Serializable{
static final long serialVersionID = 148808887655480L;
int field1;
int field2;
int field3;
}

このように、クラスの固有serialVersionIDを定数として宣言すれば、デシリアライズができるようになります。

JSON(JavaScript Object Notation)

昨日、ITスクールでは、ネットワークから xml をインプットし、そのデーターをパーシングする練習をしました。
xml は、html のようにタグ(<xx>, </xx>) をつけて(DBの)、データーを構造化するMarkup Languageです。
構造化ができれば、できるほど、私たちはデーターを効率的に探しやすく、分類して必要なデーターを抽出することも簡単になりますが、html は限定されたタグによって、タグを通して構造化することに限界がありました。主にデーターを視覚的に綺麗にまとめるタグが多いからです。
xmlは、htmlと異なり、タグを自分で定義することができます。
それによって、データーをより構造化することがで、データーの保存と転送に優れていますので、データーの交換に使われました。2000年代までは!

しかし、xml はparsingをしない場合、分かりづらいところがありました。

<users>
    <user>
        <name>John</name>
        <age>25</age>
    </user>
</users>

それを解決し、より軽いデーターの表現方式があるか、悩んだプログラマーが解決策を見つけだします。

{ "users" :[
    {
        name : "John",
        age : 25
    }
]}

JavaScriptがデーターを属性に分けてオブジェクトとして扱いましたが、とても分かりやすく、便利でした。このように、オブジェクトを表現する方式、つまり、JavaScript Object Notationの略語がJSONです。
訳したら、JavaScriptのオブジェクト表記法という意味で、JavaScriptオブジェクトのデーターをシリアライズしたfileです。

現在、JSONはxmlよりデータ交換方式で使われており、Javascriptのeval()というメソッドで簡単にparseすることもできます。

https://github.com/stleary/JSON-java

README.mdからURLをクリックすれば、最新バージョンのJSONをダウンロードできます。

Javaでは、Jsonを利用する際には、ライブラリが必要になり、Mavenからダウンロードすることができます。(json simple version.jar)

Jsonの活用

xmlの場合、AJAX(JSを通して、XMLデーターを交換する技術)と利用される場合が多いですが、
実務では、JSONを利用することが多いと述べました。

JSのオブジェクト: {name: "子犬", age:3}
JSの配列:[1,2,3]

JSはオブジェクトを{}(なみかっこう)に表現し、配列はで表現します。

クラス 使用方法
JSONObject JSONオブジェクト表記を生成したり、パースする時使用
JSONArray JSON配列表記を生成したり、パースする時使用

import java.io.IOException;
import org.json.JSONArray;
import org.json.JSONObject;


public class CreateJsonExample {
   public static void main(String[] args) throws IOException{
	JSONObject root = new JSONObject();
		
	//JSON objectの属性追加(root is )
	root.put("id", "winter");
	root.put("name", "真冬");
	root.put("age", 25);
	root.put("student", true);
		
	//objectの属性追加(root has tel)
	JSONObject tel = new JSONObject();
	tel.put("home", "02-123-1234");
	tel.put("mobile","010-123-1234");
	root.put("tel", tel);
		
	//配列を追加
	JSONArray skill = new JSONArray();
	skill.put("java");
	skill.put("C");
	skill.put("C++");
	root.put("skill", skill);
		
	//JSON
	String json = root.toString();
		
	//print JSON
	System.out.println(json);
		
	}

}

{"student":true,"skill":["java","C","C++"],"name":"真冬","tel":{"mobile":"010-123-1234","home":"02-123-1234"},"id":"winter","age":25}

JSONエディターがないので、まとめてみますと、このようなオブジェクトになります。

Object root
{"student":true,
"skill":["java","C","C++"],
"name":"真冬",
"tel":{"mobile":"010-123-1234","home":"02-123-1234"},
"id":"winter","age":25}

Discussion