안녕하세요~
드디어 저도 개발노트 작성합니다.
다양한 기법들이 있지만 저는 기존것과 다른 자바를 통한 쉬운 Json Data파싱에 대해 소개하려고 합니다.
소스는 한 페이지에서 끝납니다.
일단 java에서 Json 데이터를 파싱하기위해 google 라이브러리인 Gson을 사용할 것이구요 성능이나 여러모로 검증된 라이브러리 입니다.
그럼 소스리뷰 시작합니다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
public class ExampleSteemFacemaker77 {
public static void main(String[] args) {
try {
String url = "https://poloniex.com/public?command=returnTicker";
// 폴로닉스의 public API로 모든 코인 조회
String json = readUrl(url);
// URL을 파싱해서 InputStream을 통해 jsonText를 담는 함수
JsonParser parser = new JsonParser();
// Gson 라이브러리의 JsonParser
JsonElement rootObejct = parser.parse(json);
// String 형태의 json을 JsonObject형태로 변경
Gson gson = new Gson(); // Gson 객체생성
Map<String, Map<String, Object>> map = gson.fromJson(rootObejct, HashMap.class);
// Gson을 통해 Json을 Map으로 때려버림
for (int i = 0; i < map.size(); i++) { // 루프
String key = map.keySet().toArray(new String[map.size()])[i];
if (key.startsWith("BTC_")) { // BTC로 시작하는것들만
Map<String, Object> item = map.get(key);
item.get("last");
// 데이터 출력하는 방법 (last라는 시세 데이터 출력)
item.get("baseVolume");
item.get("percentChange");
System.out.println(key + " = " + map.get(key));
// 로그
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static String readUrl(String urlString) throws Exception {
BufferedReader reader = null;
try {
URL url = new URL(urlString);
// URL 객체를 생성
URLConnection urlConnection = url.openConnection();
urlConnection.addRequestProperty("User-Agent", "Mozilla/5.0");
// Request 환경설정(하지 않으면 문제가 발생될 수도 있음)
// Stream Reader를 통해 URL 내의 실데이터 빨아들임
reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
int read;
char[] chars = new char[1024];
while ((read = reader.read(chars)) != -1)
buffer.append(chars, 0, read);
// 문자열 데이터로 담아서
return buffer.toString();
// 완성시킴!
} finally {
if (reader != null)
reader.close();
}
}
}
아주 간단하죠?ㅎㅎ
URL 파싱부분은 readUrl이라는 함수를 따로 만들어 사용합니다.
아주 쉽고 빠르게 구해올 수 있지만 데이터의 타입까지 고려한다면 사용자 Class를 만들어서 사용하는게 더 효율적일 수 있습니다.
아래는 구글 라이브러리를 활용하기 위한 .jar파일의 다운로드 경로입니다.
https://mvnrepository.com/artifact/com.google.code.gson/gson/2.8.1
소스파일은 여기서 보실 수 있습니다.
http://www.zzalzzal.com/upload/facemaker77/ExampleSteemFacemaker77.java
최종적으로 저 내용을 출력하면 다음과 같이 나옵니다.
BTC_STEEM = {id=168.0, last=0.00046298, lowestAsk=0.00046298, highestBid=0.00046297, percentChange=0.11669078, baseVolume=278.50967183, quoteVolume=644754.69179616, isFrozen=0, high24hr=0.00047377, low24hr=0.00039051}
BTC_BELA = {id=8.0, last=0.00006052, lowestAsk=0.00006050, highestBid=0.00006027, percentChange=0.14773373, baseVolume=50.93235414, quoteVolume=917805.85110731, isFrozen=0, high24hr=0.00006110, low24hr=0.00005100}
BTC_GAME = {id=38.0, last=0.00078923, lowestAsk=0.00079989, highestBid=0.00078935, percentChange=0.08507596, baseVolume=227.35882827, quoteVolume=291432.97991700, isFrozen=0, high24hr=0.00085420, low24hr=0.00071400}
..... 쭈욱~
아주 간단하게 파싱해오는 방법에 대해 설명했습니다.
여러가지 기법이 있겠지만 저는 짤짤이라는 사이트를 개발하면서 모든 데이터를 한곳에서 수집하고 마이닝해서 뿌립니다.
실질적으로 그 방법이 훨씬 이상적이고요 트래픽을 아끼거나 메모리를 효율적으로 관리하기 위해선 그렇게 하는게 베스트입니다.
각 client call마다 건 by 건으로 가면 거래소가 디도스공격을 당했거나 문제가 생길 경우 그 피해가 고스란히 서버로 올 수도 있습니다.
서버가 클라이언트당 요청을 1개씩 받아 주는게 아니라 서버가 자신만의 요청을 따로 받고 개별적인 콜을 통해 클라이언트들에게 데이터를 전달해준다면 부하를 관리하거나 퍼포먼스를 향상시키는 데에 많은 도움이 될 것입니다.
이상 저도 1회 개발노트 올려봅니다ㅎㅎ
제 툴에는 언어가 다양하게 사용되었고 백그라운드에서도 여러가지 서비스가 돌고있습니다.
이유는 그 데이터들을 다양하게 마이닝하려면 1개의 언어와 한개의 서비스만으로는 불가능하기때문이죠~
다음에는 파이썬도 한번 준비해볼까 합니다!