본문 바로가기
프로그래밍/Spring

ObjectMapper Map to JSON String JSON String to Map 변환

by Mr-후 2020. 2. 28.
반응형

매번 하나 하나 할 때마다 새롭다. ^^; 좋은건가? 

특정 URL을 크롤링하기 위해서 파라미터를 생성하는 작업만 하는데 수십분이 소요되고 있어서 시간을 줄여보고자 최초 1회에 한하여 수집되는 파라미터 정보를 csv파일에 적재시키고 그 다음부터는 csv파일을 읽어서 처리를 할려고 한다. 

csv파일 생성/읽기는 메이븐 의존성을 추가해서 해결을 했다. 

		<dependency>
			<groupId>com.opencsv</groupId>
			<artifactId>opencsv</artifactId>
			<version>4.1</version>
		</dependency>

다음은 Map<String, String>으로 만들어진 ArrayList에 있는 정보를 JSON스트링으로 변환을 해서 저장을 하려고 한다. 

		try
		{
			ArrayList<Map<String, String>> parameters = data.getParameterList();
			ObjectMapper mapper = new ObjectMapper(); String json = "";

			StringBuffer buffer = new StringBuffer();
			for (int i =0; i < parameters.size();i++) {
				Map<String, String> map = parameters.get(i);
				 json = mapper.writeValueAsString(map);
				 json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(map);
				 json = json.replace("\n", "|");
				 json = json.replace("\"","\'");
				 buffer.append(json);
				 if (i < parameters.size()-1) {
				 	buffer.append("\n");
				 }
			}

			CsvUtils.createCsvFile(FILE_PATH,FILE_NAME, buffer.toString());

		}catch (JsonGenerationException e) {
			logger.info(" >> error : "+ e.getMessage());
			return false;
		} catch (JsonMappingException e) {
			logger.info(" >> error : "+ e.getMessage());
			return false;
		} catch (IOException e) {
			logger.info(" >> error : "+ e.getMessage());
			return false;
		}

ObjectMapper를 이용해서 JSON문자열로 변경을 했다. json.replace하는 곳에서 보면 더블쿼터(")의 경우 싱글쿼터(') 로 치환하는 부분이 있는데 이상하게도 저장된 JSON문자열을 읽어 들일때 더블쿼터(")가 짤리는 현상이 발생하여 혹시나 하고 싱글쿼터로 변경을 해서 저장했더니 이상없이 잘 되었다. 왜 그런지는 찾아보지 못했다. 

저장된 파일을 읽어 들이는 예제. 

		/**
		 * 저장되어 있는 파라미터 JSON을 Map으로 변경해서 배열에 추가
		 * 이후 기존 로직타고 내려가도록 처리 / add by yh.min 20.02.26
		 */
		for (int i = 0; i < parameters.size(); i++) {
			try {
				ObjectMapper mapper = new ObjectMapper();
				String json = parameters.get(i).replace("|", "\n").replace("\'","\"");

				HashMap<String, String> map = new HashMap<String, String>();
				map = mapper.readValue(json, new TypeReference<Map<String, String>>(){});
				parameterList.add(map);
			} catch (JsonGenerationException e) {
				logger.info(">> JsonGenerationException : "+ e.getMessage());
			} catch (JsonMappingException e) {
				logger.info(">> JsonMappingException : "+ e.getMessage());
			} catch (JsonParseException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

다수 좀 복잡스럽긴 한데 처음 JSON으로 만들 때 그대로의 문자열로 복원(JSON)하고 HashMap으로 다시 만들고 파라미터로 사용할 수 있도록 조처를 취했다. 

파라미터 만드는 시간을 단축하고 크롤링이 빨리 끝날 수 있도록 조금이나마 개선이 된 것 같다. 

 

반응형