プログラミング自主学習 DAY82 ObjectI/OSteam/JSON
ObjectI/OStream
Serializable
メモリのオブジェクトデーターをファイルもしくはネットワークに出力するためのストリームです。
その過程で、オブジェクトのデーターはbyte[] に変換されますが、データーをまるで人を並んでるように配列にデーターを入れますので、シリアライズ(直列化) と表現します。
反対にオブジェクトデーターをメモリに乗せるため、オブジェクトに変換することをデシリアライズ(逆直接化) といいます。
ObjectInputStream ois = new ObjectInputStream(InputStream is)
ObjectOutputStream oos = new ObjectOutputStream(OutputStream os)
しかし、全てのオブジェクトが出力できれば、データーの流出で問題になることは当たり前です。外部に出力しても良いクラスのオブジェクトを決めたい場合、クラスはSerializable Interfaceを具象する必要があります。
serialVersionUID
Networkを通して、他のPCにオブジェクトをデシリアライズするとしましょう。
PC1
public class Member implements Serializable{
int field1;
int field2;
}
PC2
public class Member implements Serializable{
int field1;
int field2;
int field3;
}
この場合は、同じクラス名だとしてもクラスの内容が異なるため、デシリアライズができない。
そのため、活用することがserialVersionUIDという固有ナンバーです。
serialVersionUIDは、Eclipseあるいは、javaのserialver.exeを通して生成されます。
PC1
public class Member implements Serializable{
static final long serialVersionID = 148808887655480L;
int field1;
int field2;
}
PC2
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することもできます。
Download Link
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