Json-simple-quick-guide
JSON.simple-概要
*JSON.simple* は、JSON用のシンプルなJavaベースのツールキットです。 JSON.simpleを使用して、JSONデータをエンコードまたはデコードできます。
特徴
- 仕様準拠-JSON.simpleはJSON仕様-RFC4627に完全に準拠しています。
- 軽量-クラスは非常に少なく、エンコード/デコードやjsonのエスケープなどの必要な機能を提供します。
- コレクションの再利用-操作のほとんどは、Map/Listインターフェイスを使用して行われ、再利用性が向上しています。
- ストリーミングのサポート-JSON出力テキストのストリーミングをサポートします。
- * SAXのようなコンテンツハンドラ*-大量のJSONデータをストリーミングするためのSAXのようなインターフェイスを提供します。
- 高性能-ヒープベースのパーサーが使用され、高性能を提供します。
- 依存関係なし-外部ライブラリの依存関係なし。 独立して含めることができます。
- * JDK1.2互換*-ソースコードとバイナリはJDK1.2互換です
JSON.simple-環境設定
ローカル環境のセットアップ
JSON.simpleはJavaのライブラリなので、最初の要件はマシンにJDKをインストールすることです。
システム要件
JDK | Memory | Disk Space | Operating System |
---|---|---|---|
1.5 or above. | No minimum requirement. | No minimum requirement. | No minimum requirement. |
ステップ1:マシンでのJavaインストールの検証
まず、コンソールを開き、作業しているオペレーティングシステムに基づいてjavaコマンドを実行します。
OS | Task | Command |
---|---|---|
Windows | Open Command Console | c:\> java -version |
Linux | Open Command Terminal | $ java -version |
Mac | Open Terminal | machine:< joseph$ java -version |
すべてのオペレーティングシステムの出力を確認しましょう-
OS | Output |
---|---|
Windows |
java version "1.8.0_101" Java(TM)SEランタイム環境(ビルド1.8.0_101) |
Linux |
java version "1.8.0_101" Java(TM)SEランタイム環境(ビルド1.8.0_101) |
Mac |
java version "1.8.0_101" Java(TM)SEランタイム環境(ビルド1.8.0_101) |
システムにJavaがインストールされていない場合は、次のリンクからJavaソフトウェア開発キット(SDK)をダウンロードしてください。https://www.oracle.com/technetwork/java/javase/downloads/indexl[www.oracle.com ]。 このチュートリアルのインストールバージョンとしてJava 1.8.0_101を想定しています。
ステップ2:JAVA環境を設定する
*JAVA_HOME* 環境変数を設定して、Javaがマシンにインストールされているベースディレクトリの場所を指すようにします。 例えば。
OS | Output |
---|---|
Windows | Set the environment variable JAVA_HOME to C:\Program Files\Java\jdk1.8.0_101 |
Linux | export JAVA_HOME =/usr/local/java-current |
Mac | export JAVA_HOME =/Library/Java/Home |
Javaコンパイラの場所をシステムパスに追加します。
OS | Output |
---|---|
Windows | Append the string C:\Program Files\Java\jdk1.8.0_101\bin *at the end of the system variable, Path*. |
Linux | export PATH = $PATH:$JAVA_HOME/bin/ |
Mac | not required |
上記の説明に従って、コマンド java -version を使用してJavaのインストールを確認します。
ステップ3:JSON.simpleアーカイブをダウンロードする
json-simple @ MVNRepositoryからJSON.simple jarファイルの最新バージョンをダウンロードします。 このチュートリアルを書いている時点で、json-simple-1.1.1.jarをダウンロードし、C:\> JSONフォルダーにコピーしました。
OS | Archive name |
---|---|
Windows | json-simple-1.1.1.jar |
Linux | json-simple-1.1.1.jar |
Mac | json-simple-1.1.1.jar |
ステップ4:JSON_JAVA環境を設定する
*JSON_JAVA* 環境変数を設定して、マシン上のJSON.simple jarが保存されているベースディレクトリの場所を指すようにします。 JSONフォルダーにjson-simple-1.1.1.jarを保存したと仮定しましょう。
Sr.No | OS & Description |
---|---|
1 |
Windows 環境変数JSON_JAVAをC:\ JSONに設定します |
2 |
Linux エクスポートJSON_JAVA =/usr/local/JSON |
3 |
Mac エクスポートJSON_JAVA =/Library/JSON |
ステップ5:CLASSPATH変数を設定する
JSON.simple jarの場所を指すように CLASSPATH 環境変数を設定します。
Sr.No | OS & Description |
---|---|
1 |
Windows 環境変数CLASSPATHを%CLASSPATH%;%JSON_JAVA%\ json-simple-1.1.1.jar;。;に設定します。 |
2 |
Linux export CLASSPATH = $ CLASSPATH:$ JSON_JAVA/json-simple-1.1.1.jar :. |
3 |
Mac export CLASSPATH = $ CLASSPATH:$ JSON_JAVA/json-simple-1.1.1.jar :. |
JSON.simple-JAVAマッピング
JSON.simpleは、デコードまたは解析中にエンティティを左側から右側にマップし、エンコード中にエンティティを右側から左側にマップします。
JSON | Java |
---|---|
string | java.lang.String |
number | java.lang.Number |
true | false |
java.lang.Boolean | null |
null | array |
java.util.List | object |
デコード時、_java.util.List_のデフォルトの具象クラスは_org.json.simple.JSONArray_であり、_java.util.Map_のデフォルトの具象クラスは_org.json.simple.JSONObject_です。
JSON.simple-特殊文字のエスケープ
次の文字は予約文字であり、JSONでは使用できません。文字列で使用するには、適切にエスケープする必要があります。
- Backspace は\ bに置き換えられます
- *フォームフィード*は\ fに置き換えられます
- *改行*は\ nに置き換えられます
- *キャリッジリターン*は\ rに置き換えられます
- Tab は\ tに置き換えられます
- *二重引用符*は\ "に置き換えられます
- *バックスラッシュ*は\\に置き換えられます
- JSONObject.escape()*メソッドを使用して、JSON文字列のそのような予約済みキーワードをエスケープできます。 以下は例です-
例
import org.json.simple.JSONObject;
public class JsonDemo {
public static void main(String[] args) {
JSONObject jsonObject = new JSONObject();
String text = "Text with special character/\"\'\b\f\t\r\n.";
System.out.println(text);
System.out.println("After escaping.");
text = jsonObject.escape(text);
System.out.println(text);
}
}
出力
Text with special character/"'
.
After escaping.
Text with special character \/\"'\b\f\t\r\n.
JSON.simple-JSONValueの使用
JSONValueは、指定されたJSON文字列を解析するJSONObjectを返す静的メソッドparse()を提供します。これを使用して、解析された値を取得できます。 下記の例をご覧ください。
例
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
public class JsonDemo {
public static void main(String[] args) {
String s = "[0,{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}]";
Object obj = JSONValue.parse(s);
JSONArray array = (JSONArray)obj;
System.out.println("The 2nd element of array");
System.out.println(array.get(1));
System.out.println();
JSONObject obj2 = (JSONObject)array.get(1);
System.out.println("Field \"1\"");
System.out.println(obj2.get("1"));
s = "{}";
obj = JSONValue.parse(s);
System.out.println(obj);
s = "[5,]";
obj = JSONValue.parse(s);
System.out.println(obj);
s = "[5,,2]";
obj = JSONValue.parse(s);
System.out.println(obj);
}
}
出力
The 2nd element of array
{"1":{"2":{"3":{"4":[5,{"6":7}]}}}}
Field "1"
{"2":{"3":{"4":[5,{"6":7}]}}}
{}
[5]
[5,2]
JSON.simple-例外処理
JSONParser.parse()は、無効なJSONの場合にParseExceptionをスローします。 次の例は、ParseExceptionを処理する方法を示しています。
例
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
class JsonDemo {
public static void main(String[] args) {
JSONParser parser = new JSONParser();
String text = "[[null, 123.45, \"a\tb c\"]}, true";
try{
Object obj = parser.parse(text);
System.out.println(obj);
}catch(ParseException pe) {
System.out.println("position: " + pe.getPosition());
System.out.println(pe);
}
}
}
出力
position: 24
Unexpected token RIGHT BRACE(}) at position 24.
JSON.simple-コンテナファクトリ
ContainerFactoryを使用して、解析されたJSONオブジェクト/配列のカスタムコンテナを作成できます。 最初にContainerFactoryオブジェクトを作成し、それをJSONParserのparseメソッドで使用して必要なオブジェクトを取得する必要があります。 以下の例を参照してください-
例
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.json.simple.parser.ContainerFactory;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
class JsonDemo {
public static void main(String[] args) {
JSONParser parser = new JSONParser();
String text = "{\"first\": 123, \"second\": [4, 5, 6], \"third\": 789}";
ContainerFactory containerFactory = new ContainerFactory() {
@Override
public Map createObjectContainer() {
return new LinkedHashMap<>();
}
@Override
public List creatArrayContainer() {
return new LinkedList<>();
}
};
try {
Map map = (Map)parser.parse(text, containerFactory);
map.forEach((k,v)->System.out.println("Key : " + k + " Value : " + v));
} catch(ParseException pe) {
System.out.println("position: " + pe.getPosition());
System.out.println(pe);
}
}
}
出力
Key : first Value : 123
Key : second Value : [4, 5, 6]
Key : third Value : 789
JSON.simple-ContentHandler
ContentHandlerインターフェースは、大きなJSONをストリーミングするためのインターフェースのようなSAXを提供するために使用されます。 停止可能な機能も提供します。 次の例は、概念を示しています。
例
import java.io.IOException;
import java.util.List;
import java.util.Stack;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.ContentHandler;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
class JsonDemo {
public static void main(String[] args) {
JSONParser parser = new JSONParser();
String text = "{\"first\": 123, \"second\": [4, 5, 6], \"third\": 789}";
try {
CustomContentHandler handler = new CustomContentHandler();
parser.parse(text, handler,true);
} catch(ParseException pe) {
}
}
}
class CustomContentHandler implements ContentHandler {
@Override
public boolean endArray() throws ParseException, IOException {
System.out.println("inside endArray");
return true;
}
@Override
public void endJSON() throws ParseException, IOException {
System.out.println("inside endJSON");
}
@Override
public boolean endObject() throws ParseException, IOException {
System.out.println("inside endObject");
return true;
}
@Override
public boolean endObjectEntry() throws ParseException, IOException {
System.out.println("inside endObjectEntry");
return true;
}
public boolean primitive(Object value) throws ParseException, IOException {
System.out.println("inside primitive: " + value);
return true;
}
@Override
public boolean startArray() throws ParseException, IOException {
System.out.println("inside startArray");
return true;
}
@Override
public void startJSON() throws ParseException, IOException {
System.out.println("inside startJSON");
}
@Override
public boolean startObject() throws ParseException, IOException {
System.out.println("inside startObject");
return true;
}
@Override
public boolean startObjectEntry(String key) throws ParseException, IOException {
System.out.println("inside startObjectEntry: " + key);
return true;
}
}
出力
inside startJSON
inside startObject
inside startObjectEntry: first
inside primitive: 123
inside endObjectEntry
inside startObjectEntry: second
inside startArray
inside primitive: 4
inside primitive: 5
inside primitive: 6
inside endArray
inside endObjectEntry
inside startObjectEntry: third
inside primitive: 789
inside endObjectEntry
inside endObject
inside endJSON
JSON.simple-JSONObjectのエンコード
JSON.simpleを使用して、次の方法を使用してJSONオブジェクトをエンコードできます-
- * JSONオブジェクトのエンコード-文字列へ*-シンプルなエンコード。
- * JSONオブジェクトのエンコード-ストリーミング*-出力はストリーミングに使用できます。
- * JSONオブジェクトのエンコード-マップの使用*-順序を維持してエンコードします。
- * JSONオブジェクトのエンコード-マップとストリーミングの使用*-順序を保持してストリーミングすることによるエンコード。
次の例は、上記の概念を示しています。
例
import java.io.IOException;
import java.io.StringWriter;
import java.util.LinkedHashMap;
import java.util.Map;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
class JsonDemo {
public static void main(String[] args) throws IOException {
JSONObject obj = new JSONObject();
String jsonText;
obj.put("name", "foo");
obj.put("num", new Integer(100));
obj.put("balance", new Double(1000.21));
obj.put("is_vip", new Boolean(true));
jsonText = obj.toString();
System.out.println("Encode a JSON Object - to String");
System.out.print(jsonText);
StringWriter out = new StringWriter();
obj.writeJSONString(out);
jsonText = out.toString();
System.out.println("\nEncode a JSON Object - Streaming");
System.out.print(jsonText);
Map obj1 = new LinkedHashMap();
obj1.put("name", "foo");
obj1.put("num", new Integer(100));
obj1.put("balance", new Double(1000.21));
obj1.put("is_vip", new Boolean(true));
jsonText = JSONValue.toJSONString(obj1);
System.out.println("\nEncode a JSON Object - Preserving Order");
System.out.print(jsonText);
out = new StringWriter();
JSONValue.writeJSONString(obj1, out);
jsonText = out.toString();
System.out.println("\nEncode a JSON Object - Preserving Order and Stream");
System.out.print(jsonText);
}
}
出力
Encode a JSON Object - to String
{"balance":1000.21,"is_vip":true,"num":100,"name":"foo"}
Encode a JSON Object - Streaming
{"balance":1000.21,"is_vip":true,"num":100,"name":"foo"}
Encode a JSON Object - Preserving Order
{"name":"foo","num":100,"balance":1000.21,"is_vip":true}
Encode a JSON Object - Preserving Order and Stream
{"name":"foo","num":100,"balance":1000.21,"is_vip":true}
JSON.simple-JSONArrayのエンコード
JSON.simpleを使用して、次の方法を使用してJSON配列をエンコードできます-
- * JSON配列のエンコード-ストリングへ*-単純なエンコード。
- * JSON配列のエンコード-ストリーミング*-出力はストリーミングに使用できます。
- * JSON配列のエンコード-リストの使用*-リストを使用したエンコード。
- * JSON配列のエンコード-リストとストリーミングの使用*-リストを使用したエンコードとストリーミング。
次の例は、上記の概念を示しています。
例
import java.io.IOException;
import java.io.StringWriter;
import java.util.LinkedList;
import java.util.List;
import org.json.simple.JSONArray;
import org.json.simple.JSONValue;
class JsonDemo {
public static void main(String[] args) throws IOException {
JSONArray list = new JSONArray();
String jsonText;
list.add("foo");
list.add(new Integer(100));
list.add(new Double(1000.21));
list.add(new Boolean(true));
list.add(null);
jsonText = list.toString();
System.out.println("Encode a JSON Array - to String");
System.out.print(jsonText);
StringWriter out = new StringWriter();
list.writeJSONString(out);
jsonText = out.toString();
System.out.println("\nEncode a JSON Array - Streaming");
System.out.print(jsonText);
List list1 = new LinkedList();
list1.add("foo");
list1.add(new Integer(100));
list1.add(new Double(1000.21));
list1.add(new Boolean(true));
list1.add(null);
jsonText = JSONValue.toJSONString(list1);
System.out.println("\nEncode a JSON Array - Using List");
System.out.print(jsonText);
out = new StringWriter();
JSONValue.writeJSONString(list1, out);
jsonText = out.toString();
System.out.println("\nEncode a JSON Array - Using List and Stream");
System.out.print(jsonText);
}
}
出力
Encode a JSON Array - to String
["foo",100,1000.21,true,null]
Encode a JSON Array - Streaming
["foo",100,1000.21,true,null]
Encode a JSON Array - Using List
["foo",100,1000.21,true,null]
Encode a JSON Array - Using List and Stream
["foo",100,1000.21,true,null]
JSON.simple-オブジェクトのマージ
JSON.simpleでは、JSONObject.putAll()メソッドを使用して2つのJSONオブジェクトを簡単にマージできます。
次の例は、上記の概念を示しています。
例
import java.io.IOException;
import org.json.simple.JSONObject;
class JsonDemo {
public static void main(String[] args) throws IOException {
JSONObject obj1 = new JSONObject();
obj1.put("name", "foo");
obj1.put("num", new Integer(100));
JSONObject obj2 = new JSONObject();
obj2.put("balance", new Double(1000.21));
obj2.put("is_vip", new Boolean(true));
obj1.putAll(obj2);
System.out.println(obj1);
}
}
出力
{"balance":1000.21,"is_vip":true,"num":100,"name":"foo"}
JSON.simple-配列のマージ
JSON.simpleでは、JSONArray.addAll()メソッドを使用して2つのJSON配列を簡単にマージできます。
次の例は、上記の概念を示しています。
例
import java.io.IOException;
import org.json.simple.JSONArray;
class JsonDemo {
public static void main(String[] args) throws IOException {
JSONArray list1 = new JSONArray();
list1.add("foo");
list1.add(new Integer(100));
JSONArray list2 = new JSONArray();
list2.add(new Double(1000.21));
list2.add(new Boolean(true));
list2.add(null);
list1.addAll(list2);
System.out.println(list1);
}
}
出力
["foo",100,1000.21,true,null]
JSON.simple-プリミティブ、オブジェクト、配列
JSONArrayオブジェクトを使用して、プリミティブ、オブジェクト、配列で構成されるJSONを作成できます。
次の例は、上記の概念を示しています。
例
import java.io.IOException;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
class JsonDemo {
public static void main(String[] args) throws IOException {
JSONArray list1 = new JSONArray();
list1.add("foo");
list1.add(new Integer(100));
JSONArray list2 = new JSONArray();
list2.add(new Double(1000.21));
list2.add(new Boolean(true));
list2.add(null);
JSONObject obj = new JSONObject();
obj.put("name", "foo");
obj.put("num", new Integer(100));
obj.put("balance", new Double(1000.21));
obj.put("is_vip", new Boolean(true));
obj.put("list1", list1);
obj.put("list2", list2);
System.out.println(obj);
}
}
出力
{"list1":["foo",100],"balance":1000.21,"is_vip":true,"num":100,"list2":[1000.21,true,null],"name":"foo"}
JSON.simple-プリミティブ、マップ、リストの組み合わせ
JSONValueオブジェクトを使用して、プリミティブ、Map、Listで構成されるJSONを作成できます。
次の例は、上記の概念を示しています。
例
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.json.simple.JSONValue;
class JsonDemo {
public static void main(String[] args) throws IOException {
Map m1 = new LinkedHashMap();
m1.put("k11","v11");
m1.put("k12","v12");
m1.put("k13", "v13");
List l1 = new LinkedList();
l1.add(m1);
l1.add(new Integer(100));
String jsonString = JSONValue.toJSONString(l1);
System.out.println(jsonString);
}
}
出力
[{"k11":"v11","k12":"v12","k13":"v13"},100]
JSON.simple-プリミティブ、オブジェクト、マップ、リスト
JSONValueオブジェクトを使用して、プリミティブ、オブジェクト、マップ、およびリストで構成されるJSONを作成できます。
次の例は、上記の概念を示しています。
例
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
class JsonDemo {
public static void main(String[] args) throws IOException {
JSONObject obj = new JSONObject();
Map m1 = new LinkedHashMap();
m1.put("k11","v11");
m1.put("k12","v12");
m1.put("k13", "v13");
List l1 = new LinkedList();
l1.add(new Integer(100));
obj.put("m1", m1);
obj.put("l1", l1);
String jsonString = JSONValue.toJSONString(obj);
System.out.println(jsonString);
}
}
出力
{"m1":{"k11":"v11","k12":"v12","k13":"v13"},"l1":[100]}
JSON.simple-カスタマイズされた出力
カスタムクラスに基づいてJSON出力をカスタマイズできます。 唯一の要件は、JSONAwareインターフェースを実装することです。
次の例は、上記の概念を示しています。
例
import java.io.IOException;
import org.json.simple.JSONArray;
import org.json.simple.JSONAware;
import org.json.simple.JSONObject;
class JsonDemo {
public static void main(String[] args) throws IOException {
JSONArray students = new JSONArray();
students.add(new Student(1,"Robert"));
students.add(new Student(2,"Julia"));
System.out.println(students);
}
}
class Student implements JSONAware {
int rollNo;
String name;
Student(int rollNo, String name){
this.rollNo = rollNo;
this.name = name;
}
@Override
public String toJSONString() {
StringBuilder sb = new StringBuilder();
sb.append("{");
sb.append("name");
sb.append(":");
sb.append("\"" + JSONObject.escape(name) + "\"");
sb.append(",");
sb.append("rollNo");
sb.append(":");
sb.append(rollNo);
sb.append("}");
return sb.toString();
}
}
出力
[{name:"Robert",rollNo:1},{name:"Julia",rollNo:2}]
JSON.simple-カスタマイズされた出力ストリーミング
カスタムクラスに基づいてJSONストリーミング出力をカスタマイズできます。 唯一の要件は、JSONStreamAwareインターフェースを実装することです。
次の例は、上記の概念を示しています。
例
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.LinkedHashMap;
import java.util.Map;
import org.json.simple.JSONArray;
import org.json.simple.JSONStreamAware;
import org.json.simple.JSONValue;
class JsonDemo {
public static void main(String[] args) throws IOException {
JSONArray students = new JSONArray();
students.add(new Student(1,"Robert"));
students.add(new Student(2,"Julia"));
StringWriter out = new StringWriter();
students.writeJSONString(out);
System.out.println(out.toString());
}
}
class Student implements JSONStreamAware {
int rollNo;
String name;
Student(int rollNo, String name){
this.rollNo = rollNo;
this.name = name;
}
@Override
public void writeJSONString(Writer out) throws IOException {
Map obj = new LinkedHashMap();
obj.put("name", name);
obj.put("rollNo", new Integer(rollNo));
JSONValue.writeJSONString(obj, out);
}
}
出力
[{name:"Robert",rollNo:1},{name:"Julia",rollNo:2}]