🐷

ITスクール DAY27 JSON Parsing/Oracle DBMS Install

2023/08/17に公開

JSON Parsing

今日は、JSONについて、地下鉄で勉強しましたが、ITスクールではより実務的に使い方法について勉強しました。データーを分解して、必要なやつにまた組み合わせることがparsingですね!

Javaでは、Jsonを利用する際には、ライブラリが必要です。
授業では、Mavenからダウンロードし、json simple version.jarをダウンロードしました。

駅名の由来のデーターをParsing

import java.io.InputStream;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import com.hyonhyon.http.client.HyonHyonHttpClient;

public class SubWayMain {
public static void main(String[] args) {
	try {InputStream is = HyonHyonHttpClient.download("http://openapi.seoul.go.kr:8088/xxxxx/json/TbSeoulmetroStOrigin/1/275/");
		 
        String str = HyonHyonHttpClient.convert(is, "UTF-8");	
        
	//JSONParserのオブジェクトjpがAPIを通して得た文字列データーをJSにParseします。
	//JSONObject joは最上位オブジェクトになり、すべての情報を含めています。
	
	JSONParser jp = new JSONParser();
        JSONObject jo = (JSONObject)jp.parse(str);
		
	//属性名(key)をgetに入れて、必要な部分をまたオブジェクトにリターンします。	 //Arrayに中に全ての要素(element)たちもまた、一つのオブジェクトでしたので、
	出力する際には、まずはオブジェクトを生成して、オブジェクト内のKeyを通して、
	valueを得る仕組みでした。
	
	JSONObject metro = (JSONObject) jo.get("TbSeoulmetroStOrigin"); 	
	JSONArray row = (JSONArray) metro.get("row");
		  
		  JSONObject data= null;
		  for(int i = 0; i < row.size(); i++) {
			  data = (JSONObject) row.get(i);
			  System.out.println(data.get("STATION_NAME"));
			  System.out.println(data.get("LINE"));
			  System.out.println(data.get("ORIGIN"));
			  System.out.println("================");
		  }
		  
		  
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

}
서울역
01호선
우리나라 서울의 중앙역인 서울역이 인근에 위치한데서 유래하였다. 1900년 남대문역으로 출발한 서울역은 우리나라 철도의 대표적인 역으로 주요 철도의 시발점이자 종착역이다. 1923년 경성역으로 개칭되었으나 광복 후에 서울역으로 불려지게 되었다.
================
시청
01호선
서울의 시청이 역 앞에 위치한데서 유래하였다. 시청역이 위치한 태평로는 1914년에 중국사신을 맞던 태평관의 이름을 따서 붙인 것이다. 명(明)의 사신이 오면 이 길을 거쳐 태평관에서 경복궁으로 들어갔다.
================
종각
01호선
역 앞에 보신각(종각)이 있어 역의 이름이 되었다. 종각은 조선왕조 500년 동안 밤에는 인정(人定), 새벽에는 파루를 쳐서 도성 8문을 여닫게 하는 종루(鐘樓)가 있었는데 보신각이라는 편액을 달면서 보신각으로 유래하였고, 현재는 종각으로 시민들에게 널리 알려져 있다. 3.1절, 광복절, 새해를 알리는 제야의 종을 쳐 우리에게 희망을 주는 종으로 사랑받게 되었다.
================

英語で都市の名前を入力し、もらったデータをParsing

import java.io.InputStream;
import java.net.URLEncoder;
import java.util.Scanner;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

import com.hyonhyon.http.client.HyonHyonHttpClient;

public class WeatherMain {
	public static void main(String[] args) throws Exception {
		
	Scanner sc = new Scanner(System.in);
	System.out.print("도시 이름: ");
	String cityname = URLEncoder.encode(sc.nextLine(),"UTF-8"); 
	InputStream is = HyonHyonHttpClient.download("https://api.openweathermap.org/data/2.5/weather?q="+cityname+"&appid=xxxxxxxxxxxxx&units=metric&lang=kr");
		String data = HyonHyonHttpClient.convert(is, "UTF-8");
		
	JSONParser jp = new JSONParser();
	JSONObject root = (JSONObject) jp.parse(data);
	JSONObject sys = (JSONObject) root.get("sys");
	JSONArray weather = (JSONArray)root.get("weather");
	JSONObject weatherObj = (JSONObject)weather.get(0);
	JSONObject main = (JSONObject) root.get("main");
		
	System.out.printf("나라 이름 : %s\n",sys.get("country"));
	System.out.printf("도시 이름 : %s\n",root.get("name"));
	System.out.printf("날씨 정보 : %s\n",weatherObj.get("description"));
	System.out.printf("기온     : %s℃\n",main.get("temp"));
	System.out.printf("체감 온도 : %s℃\n",main.get("feels_like"));
	System.out.printf("최저 기온 : %s℃\n",main.get("temp_min"));
	System.out.printf("최고 기온 : %s℃\n",main.get("temp_max"));
	System.out.printf("기압     : %shPa\n",main.get("pressure"));
	System.out.printf("습도     : %s",main.get("humidity") +"%");
		
	sc.close();
	}
}

도시 이름: seoul
나라 이름 : KR
도시 이름 : Seoul
날씨 정보 : 구름조금
기온     : 31.65℃
체감 온도 : 35.72℃
최저 기온 : 28.69℃
최고 기온 : 34.66℃
기압     : 1004hPa
습도     : 58%

도시 이름: yokohama
나라 이름 : JP
도시 이름 : Yokohama
날씨 정보 : 약간의 구름이 낀 하늘
기온     : 32.29℃
체감 온도 : 39.29℃
최저 기온 : 31.66℃
최고 기온 : 33.96℃
기압     : 1006hPa
습도     : 68%

座標周辺半径5km以内で検索したキーワードのお店を距離順で整列してParsing

私は半径のマックを検索しました。

import java.io.InputStream;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Scanner;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

import com.hyonhyon.http.client.HyonHyonHttpClient;

public class LocSearchMain {
		
Scanner sc = new Scanner(System.in);
System.out.print("검색하고 싶은 키워드를 입력해주세요 : ");
String keyword = URLEncoder.encode(sc.next(),"UTF-8");
		
String address = "https://dapi.kakao.com/v2/local/search/keyword.json"
				+ "?y=37.5693582"
				+ "&x=126.9858652"
				+ "&query="
				+ keyword
			    + "&sort=distance";
		
HashMap<String, String> headers = new HashMap<>();
headers.put("Authorization","KakaoAK 16e6c58f062166934ed7652260b1bc03");
	InputStream is = HyonHyonHttpClient.download(address,headers);
	String data = HyonHyonHttpClient.convert(is,"UTF-8");
		
	JSONParser jp = new JSONParser();
	JSONObject root = (JSONObject) jp.parse(data);
	JSONObject meta = (JSONObject) root.get("meta");
		
	System.out.printf("총 검색 결과 수 :%s개\n",meta.get("total_count"));
	System.out.printf("현재 페이지 결과 수 :%s개\n",meta.get("pageable_count"));
	System.out.println();
			
	JSONArray ja =(JSONArray)root.get("documents");
		
	for(int i = 0; i< ja.size(); i++) {
		JSONObject jo3 =(JSONObject)ja.get(i);	
		System.out.printf("주소 : %s\n",jo3.get("address_name"));
		System.out.printf("전화번호 :%s\n",jo3.get("phone"));
		System.out.printf("상호명 :%s\n",jo3.get("place_name"));
		System.out.printf("거리 :%sm\n",jo3.get("distance"));
		System.out.println();
	}
		
	sc.close();
  }
}
검색하고 싶은 키워드를 입력해주세요 : 맥도날드 //McDonald
총 검색 결과 수 :626개
현재 페이지 결과 수 :45개

주소 : 서울 종로구 공평동 70
전화번호 :080-208-1588
상호명 :한국맥도날드 본사
거리 :251m

주소 : 서울 종로구 종로3가 10
전화번호 :070-7017-0434
상호명 :맥도날드 종로3점
거리 :427m

주소 : 서울 종로구 종로3가 10
전화번호 :
상호명 :맥도날드 종로3가 개방화장실
거리 :428m

주소 : 서울 중구 명동1가 48-2
전화번호 :02-6215-8200
상호명 :맥도날드 명동점
거리 :586m
.
.
.

URLの構造に対しての理解を足りなかったので、相当苦戦しました。
Requestまでは成功したのですが、400 errorで、何が問題だったのだろうと悩んでいた途中、クラスメイトのお方から、urlに入れるテキストの変更を提案されました。

?を2つ入れてしまって、ずっと400 errorがでたのです。
?key=value&key=value&key=valueとqueryが何か相当勉強になりました。

DataBaseSystem

DB構造化したデーターの集まりです。

DBMS : 様々なDataBase(構造化したデーターの集まり) + Management System。(CRUD)

Relational Database: DBを行、列に構成されたターブルに扱い、テーブル同士に関係性を組むこともできるため、JOINなどでテーブルを合わせたりすることもできます。

SQL : Structured Query Language (「構造化問い合わせ言語」)の略語で、
DBMSのデーターをCRUDするための言語だと理解すれば、オッケーです。

列(column):各列は一意の名前を持ち、独自のタイプを持っています。
これらの列はフィールドfieldまたは属性attributeとも呼ばれます。

行(row):
行は関連するデータの集まりを意味します。1つのテーブルのすべての行は同じ数の列を持っています。これらの行はタプル(tuple)またはレコード(record)とも呼ばれます。

値(value) :テーブルは各行と列に対応する値を持っています。これらの値は列のタイプに適した値である必要があります。

キー(key) :テーブル内で行の識別子として使用される列をキー(key)と呼びます。

メモ帳もDBであり、それを集めたフォルダーはDBMSにもなれますが、制限された機能と安全性、データーの整合性に問題があるため、より安全で、効率的にDBを扱るために我々はDBMSを利用します。

CMDからログイン

sqlplus / as sysdba

sqlplus : oracleのアクセスプログラム名
/ : 現在、使っているOS(Oracleではない)でログイン
as sysdba : 最上位管理者として

今、使っているOSのアカウントで、最上位管理者としてログインします。
ID,PWなしでCMDを通してDBMSにログインができます。
まだ、勉強が始まってばかりですが、保安上大丈夫かな?

DBAアカウント作成

create user **ID** identified by **PW**;

IDとPWを作成し、アカウントを作成します。

grant connect, resource,dba to ID;

作成したアカウントに権限が割り当てます。
dbaは、data base administratorという意味で、管理者みたいなやつです。
connectはアクセス権限、resourceはCRUD権限になります。

Instant Client

Instant Client は、Oracleデータベースに接続するための最小限のライブラリとツールが含まれたパッケージです。このパッケージは、データベースサーバに直接接続せずに、Oracleデータベースと相互作用できるようにします。

Instatant Client for Windows x64に入り、oracle basic, sql plus , jdbcをダウンロードして、同じフォルダーにアーカイブを解凍します。

Connect後、一般アカウント作成

また、CMDを開き、Instant Clientを設置した経路にcdをします。

cd C:\Users\soldesk\Downloads\instantclient_19_20

その後、先ほど作成したDBAアカウントにConnectします。

sqlplus ID/PW/@IP:PORT/SID
sqlplus kentaro/1234@192.111.1.11:1521/xe

その後、DBAではなく、一般アカウントを作成します。

create user ID2 identified by PW2;
grant connect, resource to ID2;

Table作成

自分が作りたいディレクトリにTableを作成します。

create tablespace TSNAME datafile 'DIR/FILENAME.dbf' size 500m;
create tablespace HyonHyonTS datafile 'C:\/Oracle/Hyon.dbf' size 500m;

一般アカウントにテーブルを扱える権限を挙げます。

alter user ID2 default tablespace TSNAME;
alter user rnjsgurah2 default tablespace HyonHyonTS;

最終チェック

cd C:\Users\soldesk\Downloads\instantclient_19_20
sqlplus rnjsgurah2/824655@192.168.0.16:1521/xe

Discussion