Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 스프링
- jpa
- Servlet
- Proxy
- 인프런
- Exception
- kotlin
- JDBC
- 알고리즘
- Thymeleaf
- http
- 백준
- Android
- transaction
- JPQL
- java
- spring
- 스프링 핵심 기능
- QueryDSL
- Spring Boot
- AOP
- pointcut
- 스프링 핵심 원리
- SpringBoot
- Greedy
- 자바
- db
- springdatajpa
- 그리디
- 김영한
Archives
- Today
- Total
개발자되기 프로젝트
[Server] return 값 분석 본문
1. 도시내 길찾기 출력 데이터
번호 | 요소 | 데이터 타입 | 필수값 | 출력 개수 | 설명 |
1 | result | 확장노드 | Y | 1 | 데이터를 포함하는 최 상위 노드 |
1-1 | searchType | int | Y | 1 | 결과 구분 (도시내 or 도시간 직통 or 도시간 환승) 0-도시내, 1-도시간 직통, 2-도시간 환승 |
1-2 | outTrafficCheck | int | Y | 1 | 도시간 "직통" 탐색 결과 유무(환승 X) 0-False, 1-True |
1-3 | busCount | int | Y | 1 | 버스 결과 개수 |
1-4 | subwayCount | int | Y | 1 | 지하철 결과 개수 |
1-5 | subwayBusCount | int | Y | 1 | “버스+지하철” 결과 개수 |
1-6 | pointDistance | double | Y | 1 | 출발지(SX, SY)와 도착지(EX, EY)의 직선 거리 (미터) |
1-7 | startRadius | int | Y | 1 | 출발지 반경 |
1-8 | endRadius | int | Y | 1 | 도착지 반경 |
1-9 | path | 확장노드 | Y | 1...n | 결과 리스트 확장 노드 |
1-9-1 | pathType | int | Y | 1 | 결과 종류 1-지하철, 2-버스, 3-버스+지하철 |
1-9-2 | info | 확장노드 | Y | 1 | 요약 정보 확장 노드 |
1-9-2-1 | trafficDistance | double | Y | 1 | 도보를 제외한 총 이동 거리 |
1-9-2-2 | totalWalk | int | Y | 1 | 총 도보 이동 거리 |
1-9-2-3 | totalTime | int | Y | 1 | 총 소요시간 |
1-9-2-4 | payment | int | Y | 1 | 총 요금 |
1-9-2-5 | busTransitCount | int | Y | 1 | 버스 환승 카운트 |
1-9-2-6 | subwayTransitCount | int | Y | 1 | 지하철 환승 카운트 |
1-9-2-7 | mapObj | string | Y | 1 | 보간점 API를 호출하기 위한 파라미터 값 |
1-9-2-8 | firstStartStation | string | Y | 1 | 최초 출발역/정류장 |
1-9-2-9 | lastEndStation | string | Y | 1 | 최종 도착역/정류장 |
1-9-2-10 | totalStationCount | int | Y | 1 | 총 정류장 합 |
1-9-2-11 | busStationCount | int | Y | 1 | 버스 정류장 합 |
1-9-2-12 | subwayStationCount | int | Y | 1 | 지하철 정류장 합 |
1-9-2-13 | totalDistance | double | Y | 1 | 총 거리 |
1-9-3 | subPath | 확장노드 | Y | 1...n | 이동 교통 수단 정보 확장 노드 |
1-9-3-1 | trafficType | int | Y | 1 | 이동 수단 종류 (도보, 버스, 지하철) 1-지하철, 2-버스, 3-도보 |
1-9-3-2 | distance | double | Y | 1 | 이동 거리 |
1-9-3-3 | sectionTime | int | Y | 1 | 이동 소요 시간 |
1-9-3-4 | stationCount | int | Y/N | 1 | 이동하여 정차하는 정거장 수(지하철, 버스 경우만 필수) |
1-9-3-5 | lane | 확장노드 | Y/N | 1...n | 교통 수단 정보 확장 노드 |
1-9-3-5-1 | name | string | Y/N | 1 | 지하철 노선명 (지하철인 경우에만 필수) |
1-9-3-5-2 | busNo | string | Y/N | 1 | 버스 번호 (버스인 경우에만 필수) |
1-9-3-5-3 | type | int | Y/N | 1 | 버스 타입 (버스인 경우에만 필수,최하단 참조) |
1-9-3-5-4 | busID | int | Y/N | 1 | 버스 코드 (버스인 경우에만 필수) |
1-9-3-5-5 | subwayCode | int | Y/N | 1 | 지하철 노선 번호 (지하철인 경우에만 필수) |
1-9-3-5-6 | subwayCityCode | int | Y/N | 1 | 지하철 도시코드 (지하철인 경우에만 필수) |
1-9-3-6 | startName | string | Y | 1 | 승차 정류장/역명 |
1-9-3-7 | startX | double | Y | 1 | 승차 정류장/역 X 좌표 |
1-9-3-8 | startY | double | Y | 1 | 승차 정류장/역 Y 좌표 |
1-9-3-9 | endName | string | Y | 1 | 하차 정류장/역명 |
1-9-3-10 | endX | double | Y | 1 | 하차 정류장/역 X 좌표 |
1-9-3-11 | endY | double | Y | 1 | 하차 정류장/역 Y 좌표 |
1-9-3-12 | way | string | Y/N | 1 | 방면 정보 (지하철인 경우에만 필수) |
1-9-3-13 | wayCode | int | Y/N | 1 | 방면 정보 코드(지하철의 첫번째 경로에만 필수) 1 : 상행, 2: 하행 |
1-9-3-14 | door | string | Y/N | 1 | 지하철 빠른 환승 위치 (지하철인 경우에만 필수) |
1-9-3-15 | startID | int | Y | 1 | 출발 정류장/역 코드 |
1-9-3-16 | endID | int | Y | 1 | 도착 정류장/역 코드 |
1-9-3-17 | startExitNo | string | N | 1 | 지하철 들어가는 출구 번호 (지하철인 경우에만 사용되지만 해당 태그가 없을 수도 있다.) |
1-9-3-18 | startExitX | double | N | 1 | 지하철 들어가는 출구 X좌표(지하철인 경우에 만 사용되지만 해당 태그가 없을 수도 있다.) |
1-9-3-19 | startExitY | double | N | 1 | 지하철 들어가는 출구 Y좌표(지하철인 경우에 만 사용되지만 해당 태그가 없을 수도 있다.) |
1-9-3-20 | endExitNo | string | N | 1 | 지하철 나가는 출구 번호(지하철인 경우에만 사용되지만 해당 태그가 없을 수도 있다.) |
1-9-3-21 | endExitX | double | N | 1 | 지하철 나가는 출구 X좌표(지하철인 경우에만 사용되지만 해당 태그가 없을 수도 있다.) |
1-9-3-22 | endExitY | double | N | 1 | 지하철 나가는 출구 Y좌표(지하철인 경우에만 사용되지만 해당 태그가 없을 수도 있다.) |
1-9-3-23 | passStopList | 확장노드 | Y | 1 | 경로 상세구간 정보 확장 노드(국문에 한하여 제공) |
1-9-3-23-1 | stations | 확장노드 | Y | 1...n | 정류장 정보 그룹노드 |
1-9-3-23-1-1 | index | int | Y | 1 | 정류장 순번 |
1-9-3-23-1-2 | stationID | int | Y | 1 | 정류장 ID |
1-9-3-23-1-3 | stationName | string | Y | 1 | 정류장 명칭 |
1-9-3-23-1-4 | x | string | Y | 1 | 정류장 X좌표 |
1-9-3-23-1-5 | y | string | Y | 1 | 정류장 Y좌표 |
1-9-3-23-1-6 | isNonStop | string | Y/N | 1 | 미정차 정류장 여부 Y/N(버스인 경우에만 필수) |
2. 예시
{
"result":{
"path":[{
"pathType":1,
"subPath":[{
"trafficType":1,
"distance":2000,
"sectionTime":9,
"lane":{
"name":"수도권 2호선",
"subwaycode":2,
"subwayCityCode":1000
},
"stationCount":1,
"passStopList":{
"stations":[{
"index":0,
"stationName":"당산",
"stationID":237,
"x":126.902682,
"y":37.534863
},
{
"index":1,
"stationName":"합정",
"stationID":238,
"x":126.914543,
"y":37.549942
}]
},
"way":"합정",
"wayCode":2,
"startX":126.90267725576584,
"startY":37.534862332279936,
"startID":237,
"startName":"당산",
"endExitNo":"",
"endExitX":0.0,
"endExitY":0.0,
"endX":126.91454311097073,
"endY":37.549938143345756,
"endID":238,
"endName":"합정"
},
…(중략)...
],
"info":{
"mapObj":"2:2:237:238",
"payment":1250,
"busTransitCount":0,
"subwayTransitCount":1,
"busStationCount":0,
"subwayStationCount":1,
"totalStationCount":1,
"totalTime":9,
"totalWalk":0,
"trafficDistance":2000,
"totalDistance":2000,
"firstStartStation":"당산",
"lastEndStation":"합정",
"totalWalkTime":-1
}
}],
"searchType":0,
"startRadius":700,
"endRadius":700,
"subwayCount":1,
"busCount":10,
"subwayBusCount":0,
"pointDistance":1967,
"outTrafficCheck":0
}
}
return된 json구조는 대략 다음과 같다.
3. JOSN파싱
Json라이브러리를 사용하면 쉽게 파싱할 수 있다.
implementation 'org.json:json:20190722'
SearchRouteReq searchRouteReq = new SearchRouteReq(SX, SY, EX, EY);
String result = odSayClient.searchRoute(searchRouteReq);
JSONObject jsonResult = new JSONObject(result);
JsonObject, JsonArray를 사용할 수 있다.
3. DTO
Json 데이터를 객체로 변환하자.
계층 구조에 따라 class를 만들어 줬다.
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class SearchRouteRes {
private JSONObject result;
private int searchType;
private int outTrafficCheck;
private int busCount;
private int subwayCount;
private int subwayBusCount;
private int pointDistance; //왜 double로안들어옴?
private int startRadius;
private int endRadius;
private ArrayList<Path> pathList;
private JSONObject path;
public SearchRouteRes(JSONObject jsonResult) {
this.result = jsonResult.getJSONObject("result");
this.searchType = (int) result.get("searchType");
this.outTrafficCheck = (int) result.get("outTrafficCheck");
this.busCount = (int) result.get("busCount");
this.subwayBusCount = (int) result.get("subwayBusCount");
this.subwayCount = (int) result.get("subwayCount");
this.pointDistance = (int) result.get("pointDistance");
this.startRadius = (int) result.get("startRadius");
this.endRadius = (int) result.get("endRadius");
JSONArray path = result.getJSONArray("path");
pathList = new ArrayList<>();
for (int i=0; i<path.length(); i++){
JSONObject eachPath= (JSONObject) path.get(i);
pathList.add(new Path(eachPath));
}
}
}
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class Path {
private int pathType;
private JSONObject info;
private double trafficDistance;
private int totalWalk;
private int totalTime;
private int payment;
private int busTransitCount;
private int subwayTransitCount;
private String mapObj;
private String firstStartStation;
private String lastEndStation;
private int totalStationCount;
private int busStationCount;
private int subwayStationCount;
private double totalDistance;
private int totalWalkTime;
private ArrayList<SubPath> subPathList = new ArrayList<>();
private JSONObject subPath;
public Path(JSONObject path) {
this.pathType = (int) path.get("pathType");
this.info = (JSONObject) path.get("info");
this.trafficDistance = (double) info.get("trafficDistance");
this.totalWalk = (int) info.get("totalWalk");
this.totalTime = (int) info.get("totalTime");
this.payment = (int) info.get("payment");
this.busTransitCount = (int) info.get("busTransitCount");
this.subwayTransitCount = (int) info.get("subwayTransitCount");
this.mapObj = (String) info.get("mapObj");
this.firstStartStation = (String) info.get("firstStartStation");
this.lastEndStation = (String) info.get("lastEndStation");
this.totalStationCount = (int) info.get("totalStationCount");
this.busStationCount = (int) info.get("busStationCount");
this.subwayStationCount = (int) info.get("subwayStationCount");
this.totalDistance = (double) info.get("totalDistance");
this.totalWalk = (int) info.get("totalWalk");
JSONArray subPath = path.getJSONArray("subPath");
for (int i=0; i<subPath.length(); i++){
JSONObject eachSubPath = (JSONObject) subPath.get(i);
subPathList.add(new SubPath(eachSubPath, i));
}
}
}
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class SubPath {
//필수값 trafficType = 3 도보
private int trafficType;
private int distance; //왜 double로 안들어옴?
private int sectionTime;
//버스, 지하철 타는 경우
//trafficType = 1 -> 지하철
//trafficType = 2 -> 버스
private int stationCount;
private JSONArray laneJasonArray;
private JSONObject laneJson;
private Lane lane;
private String startName;
private double startX;
private double startY;
private String endName;
private double endX;
private double endY;
private String way;
private int wayCode;
private String door;
private int startID;
private int endID;
private JSONObject passStopList;
private ArrayList<Station> stations;
public SubPath(JSONObject eachSubPath, int index) {
this.trafficType = (int) eachSubPath.get("trafficType");
this.distance = (int) eachSubPath.get("distance"); //왜 double로 안들어옴?
this.sectionTime = (int) eachSubPath.get("sectionTime");
if (trafficType != 3){
this.stationCount = (int) eachSubPath.get("stationCount");
this.laneJasonArray = eachSubPath.getJSONArray("lane");
this.laneJson= (JSONObject) laneJasonArray.get(0);
this.lane= new Lane(laneJson, trafficType);
this.startName = (String) eachSubPath.get("startName");
this.startX = (double) eachSubPath.get("startX");
this.startY = (double) eachSubPath.get("startY");
this.endName = (String) eachSubPath.get("endName");
this.endX = (double) eachSubPath.get("endX");
this.endY = (double) eachSubPath.get("endY");
if (trafficType == 1){
//지하철의 경우에만
this.way = (String) eachSubPath.get("way");
if (index==0){
//지하철 첫 번 째 경로에만.
this.wayCode = (int) eachSubPath.get("wayCode");
}
this.door = (String) eachSubPath.get("door");
}
this.startID = (int) eachSubPath.get("startID");
this.endID = (int) eachSubPath.get("endID");
this.passStopList = eachSubPath.getJSONObject("passStopList");
JSONArray stationList = passStopList.getJSONArray("stations");
stations = new ArrayList<>();
for (int i=0; i<stationList.length(); i++){
JSONObject stationJson = (JSONObject) stationList.get(i);
stations.add(new Station(stationJson, trafficType));
}
}
}
@Getter
public static class Lane{
private String name;
private String busNo;
private int type;
private int busID;
private int subwayCode;
private int subwayCityCode;
public Lane(JSONObject laneJson, int trafficType) {
if (trafficType == 1){
//지하철
this.name = (String) laneJson.get("name");
this.subwayCode = (int) laneJson.get("subwayCode");
this.subwayCityCode = (int) laneJson.get("subwayCityCode");
}else if (trafficType == 2){
//버스
this.busNo = (String) laneJson.get("busNo");
this.type = (int) laneJson.get("type");
this.busID = (int) laneJson.get("busID");
}
}
}
public static class Station{
private int index;
private String stationName;
private String x;
private String y;
private String isNonStop;
public Station(JSONObject stationJson, int trafficType) {
this.index = (int) stationJson.get("index");
this.stationName = (String) stationJson.get("stationName");
this.x = (String) stationJson.get("x");
this.y = (String) stationJson.get("y");
if (trafficType == 2){
this.isNonStop = (String) stationJson.get("isNonStop");
}
}
}
}
4. GitHiub: 220120 JsonParsing.
'Project > 대중교통 길찾기' 카테고리의 다른 글
프론트 개발2 (0) | 2022.01.22 |
---|---|
간단한 프론트 개발 (0) | 2022.01.20 |
[Server] Odsay API호출 문제 해결 (0) | 2022.01.18 |
[Server] Odsay 대중교통 api 연동 (0) | 2022.01.17 |
[Server] 회원 도메인 개발 (0) | 2022.01.15 |
Comments