/**
   * RealGrid 의 JSON전문을 GridData 객체로 전환한다.
   *
   * <p>1. request 전문의 mode, rows, headers로 구분하여 파싱 및 WiseGrid 데이터 구조에 Set 한다.
   *
   * @param rawData request 로 올라온 RealGrid 의 JSON전문
   * @return GridData JSON전문을 파싱하여 WiseGrid 의 자료구조에 맞춰 반환
   * @throws Exception
   * @since v1, 0, 0, 0
   */
  public static GridData parse(String rawData) throws Exception {

    LinkedHashMap<String, Object> jsonDataMap =
        new ObjectMapper().readValue(rawData, LinkedHashMap.class);
    GridData gridData = new GridData();
    String gridMode = "";

    // JSON 전문의 mode, params, headers로 구분하여 파싱한다.
    for (String dataKey : jsonDataMap.keySet()) {

      // 모드 입력
      if (json_mode.equals(dataKey)) {
        //                logger.info("--------------------------- JSON전문의 mode를 GridData구조에  입력한다.
        // --------------------------------");
        gridMode = (String) jsonDataMap.get(dataKey);
        gridData.setMode(gridMode);
        //                logger.info("mode : " + gridMode);
        //                logger.info("GridData Info: " + gridData);
        //
        // logger.info("---------------------------------------------------------------------------------------------------------");
        // parameter 입력
      } else if (json_params.equals(dataKey)) {
        //                logger.info("--------------------------- JSON전문의 params를 GridData구조에 입력한다.
        // --------------------------------");
        setJsonParamData(gridData, (List<LinkedHashMap<String, String>>) jsonDataMap.get(dataKey));
        //
        // logger.info("---------------------------------------------------------------------------------------------------------");
        // 헤더정보 입력
      } else if (json_headers.equals(dataKey)) {
        //                logger.info("--------------------------- JSON전문의 headers를 GridData구조에
        // 입력한다. --------------------------------");
        setJsonHeaderData(gridData, (List<LinkedHashMap<String, Object>>) jsonDataMap.get(dataKey));
        //
        // logger.info("---------------------------------------------------------------------------------------------------------");
        // rows 처리
      } else if (json_rows.equals(dataKey)) {
        setRowData(gridData, (List<List<String>>) jsonDataMap.get(dataKey));
      } else {
        throw new Exception("전문형식에 적합하지 않은 문자가 존재합니다.");
      }
    }
    return gridData;
  }
 /**
  * @param gdReq
  * @return GridData
  * @since 2015/09/09
  */
 public static GridData cloneResponseGridData(GridData gdReq) throws Exception {
   GridData gdRes = new GridData();
   // mode 추가
   gdRes.setMode(gdReq.getMode());
   String headers[] = gdReq.getHeaderSequence();
   for (int i = 0; i < gdReq.getHeaderCount(); i++) {
     GridHeader ghValue = gdReq.getHeader(headers[i]);
     String headerDataType = gdReq.getHeader(headers[i]).getDataType();
     gdRes.createHeader(headers[i], headerDataType);
     if (headerDataType.equals("L")) {
       if (ghValue.getComboValues() != null)
         if (ghValue.getComboValues().length != 0)
           gdRes
               .getHeader(headers[i])
               .setComboValues(ghValue.getComboValues(), ghValue.getComboHiddenValues());
       // 오리진 콤보데이터 확인을 위한 코드.
       gdRes
           .getHeader(headers[i])
           .setOriginComboValues(
               ghValue.getOriginComboValues(), ghValue.getOriginComboHiddenValues());
       if (ghValue.hasComboList()) {
         for (int j = 0; j < ghValue.getComboListCount(); j++) {
           String comboListKey = ghValue.getComboListKeys()[j];
           gdRes
               .getHeader(headers[i])
               .addComboListValues(
                   comboListKey,
                   ghValue.getComboValues(comboListKey),
                   ghValue.getComboHiddenValues(comboListKey));
         }
       }
     } else if (headerDataType.equals("I")) {
       if (ghValue.getImageURLs() != null)
         if (ghValue.getImageURLs().length != 0)
           gdRes.getHeader(headers[i]).setImageURLs(ghValue.getImageURLs());
     }
   }
   return gdRes;
 }