gson デコード 複数レコード

[ JSONデコードサンプル ]



import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;

  protected void processRequest(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {

    // ++ リクエストパラメータ取得 ++ //
    String jsnlist = request.getParameter("fclist");

    // JSONデコードはリフレクションで行う //
    ArrayList<Facility> fcList = new ArrayList();
    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    Type type = new TypeToken <ArrayList<Facility>>() {
    }.getType();
    fcList = gson.fromJson(jsnlist, type);

gson デコード 単レコード

[ JSONリクエストパラメーター値 (実際は未整形)]


{
    "cd_unlo": "JPUKB",
    "tp_facil": "OT",
    "lat": 34.729880639820365,
    "lon": 135.25307087456054,
    "nm_facil": "未決定 788",
    "nm_facil_e": "UNKNOWN 788"
}

[ JSONリクエストデコードサンプル ]


  protected void processRequest(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {

    // ++ リクエストパラメータ取得 ++ //
    String latlonsjsn = request.getParameter("latlons");        

    // JSONデコードはリフレクションで行う // 
    PortLatLon PLL = new PortLatLon();
    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    Type type = new TypeToken<PortLatLon>() {
    }.getType();
    PLL = gson.fromJson(latlonsjsn, type);

[ JAVAクラス ]


package vesselsch;

/**
 * GoogleMap用陸上施設型 
 * @author 田中尚
 */
public class Facility {
  
  private int id;
  private int fid;
  private String tp_facil;
  private String nm_facil;
  private String no_zip;
  private String nm_addr;
  private double lat = 0;
  private double lon = 0;
  private String nm_url;
  private String no_tel;
  private String tm_add;
  private String tm_updt;
  private String tm_lastupdt;
  private String nm_rmtaddr;
  private String nm_remark;
  private String cd_unlo;
  
  private String nm_facil_e = "";
  private String nm_addr_e = "";
  
  private String file1 = "";
  private short is_imgexist;
  
  // 保税蔵置場経緯度更新時リフレクションでセットする用 //
  private String flgbarea;
  private String cd_naccs;
  // US Broker経緯度更新時リフレクションでセットする用 //
  private String flgusbroker;
  
  

  /**
   * @return the id
   */
  public int getId() {
    return id;
  }

  /**
   * @param id the id to set
   */
  public void setId(int id) {
    this.id = id;
  }

  /**
   * @return the fid
   */
  public int getFid() {
    return fid;
  }

  /**
   * @param fid the fid to set
   */
  public void setFid(int fid) {
    this.fid = fid;
  }

  /**
   * @return the tp_facil
   */
  public String getTp_facil() {
    return tp_facil;
  }

  /**
   * @param tp_facil the tp_facil to set
   */
  public void setTp_facil(String tp_facil) {
    this.tp_facil = tp_facil;
  }

  /**
   * @return the nm_facil
   */
  public String getNm_facil() {
    return nm_facil;
  }

  /**
   * @param nm_facil the nm_facil to set
   */
  public void setNm_facil(String nm_facil) {
    this.nm_facil = nm_facil;
  }

  /**
   * @return the no_zip
   */
  public String getNo_zip() {
    return no_zip;
  }

  /**
   * @param no_zip the no_zip to set
   */
  public void setNo_zip(String no_zip) {
    this.no_zip = no_zip;
  }

  /**
   * @return the nm_addr
   */
  public String getNm_addr() {
    return nm_addr;
  }

  /**
   * @param nm_addr the nm_addr to set
   */
  public void setNm_addr(String nm_addr) {
    this.nm_addr = nm_addr;
  }

  /**
   * @return the lat
   */
  public double getLat() {
    return lat;
  }

  /**
   * @param lat the lat to set
   */
  public void setLat(double lat) {
    this.lat = lat;
  }

  /**
   * @return the lon
   */
  public double getLon() {
    return lon;
  }

  /**
   * @param lon the lon to set
   */
  public void setLon(double lon) {
    this.lon = lon;
  }

  /**
   * @return the nm_url
   */
  public String getNm_url() {
    return nm_url;
  }

  /**
   * @param nm_url the nm_url to set
   */
  public void setNm_url(String nm_url) {
    this.nm_url = nm_url;
  }

  /**
   * @return the no_tel
   */
  public String getNo_tel() {
    return no_tel;
  }

  /**
   * @param no_tel the no_tel to set
   */
  public void setNo_tel(String no_tel) {
    this.no_tel = no_tel;
  }

  /**
   * @return the tm_add
   */
  public String getTm_add() {
    return tm_add;
  }

  /**
   * @param tm_add the tm_add to set
   */
  public void setTm_add(String tm_add) {
    this.tm_add = tm_add;
  }

  /**
   * @return the tm_updt
   */
  public String getTm_updt() {
    return tm_updt;
  }

  /**
   * @param tm_updt the tm_updt to set
   */
  public void setTm_updt(String tm_updt) {
    this.tm_updt = tm_updt;
  }

  /**
   * @return the tm_lastupdt
   */
  public String getTm_lastupdt() {
    return tm_lastupdt;
  }

  /**
   * @param tm_lastupdt the tm_lastupdt to set
   */
  public void setTm_lastupdt(String tm_lastupdt) {
    this.tm_lastupdt = tm_lastupdt;
  }

  /**
   * @return the nm_rmtaddr
   */
  public String getNm_rmtaddr() {
    return nm_rmtaddr;
  }

  /**
   * @param nm_rmtaddr the nm_rmtaddr to set
   */
  public void setNm_rmtaddr(String nm_rmtaddr) {
    this.nm_rmtaddr = nm_rmtaddr;
  }

  /**
   * @return the nm_remark
   */
  public String getNm_remark() {
    return nm_remark;
  }

  /**
   * @param nm_remark the nm_remark to set
   */
  public void setNm_remark(String nm_remark) {
    this.nm_remark = nm_remark;
  }

  /**
   * @return the cd_unlo
   */
  public String getCd_unlo() {
    return cd_unlo;
  }

  /**
   * @param cd_unlo the cd_unlo to set
   */
  public void setCd_unlo(String cd_unlo) {
    this.cd_unlo = cd_unlo;
  }

  /**
   * @return the nm_facil_e
   */
  public String getNm_facil_e() {
    return nm_facil_e;
  }

  /**
   * @param nm_facil_e the nm_facil_e to set
   */
  public void setNm_facil_e(String nm_facil_e) {
    this.nm_facil_e = nm_facil_e;
  }

  /**
   * @return the nm_addr_e
   */
  public String getNm_addr_e() {
    return nm_addr_e;
  }

  /**
   * @param nm_addr_e the nm_addr_e to set
   */
  public void setNm_addr_e(String nm_addr_e) {
    this.nm_addr_e = nm_addr_e;
  }

  /**
   * @return the file1
   */
  public String getFile1() {
    return file1;
  }

  /**
   * @param file1 the file1 to set
   */
  public void setFile1(String file1) {
    this.file1 = file1;
  }

  /**
   * @return the is_imgexist
   */
  public short getIs_imgexist() {
    return is_imgexist;
  }

  /**
   * @param is_imgexist the is_imgexist to set
   */
  public void setIs_imgexist(short is_imgexist) {
    this.is_imgexist = is_imgexist;
  }

  /**
   * @return the flgbarea
   */
  public String getFlgbarea() {
    return flgbarea;
  }

  /**
   * @param flgbarea the flgbarea to set
   */
  public void setFlgbarea(String flgbarea) {
    this.flgbarea = flgbarea;
  }

  /**
   * @return the cd_naccs
   */
  public String getCd_naccs() {
    return cd_naccs;
  }

  /**
   * @param cd_naccs the cd_naccs to set
   */
  public void setCd_naccs(String cd_naccs) {
    this.cd_naccs = cd_naccs;
  }

  /**
   * @return the flgusbroker
   */
  public String getFlgusbroker() {
    return flgusbroker;
  }

  /**
   * @param flgusbroker the flgusbroker to set
   */
  public void setFlgusbroker(String flgusbroker) {
    this.flgusbroker = flgusbroker;
  }
  
  
  
  
  
}
 

gson エンコード サンプルコード リスト

[ リストオブジェクト複レコード ]



import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

    // 検索処理 //
    ParamExRateSS PE = new ParamExRateSS(vessel);
    ArrayList reslist = new ArrayList(PE.selectExRateSSList());

    // ++ JSONオブジェクトに格納 ++ //
    JSONResultGrid grid = new JSONResultGrid();
    grid.setPage(1);
    grid.setTotal(1);
    grid.setRecords(reslist.size());
    grid.setRows(reslist);
    //grid.setUserdata(usrdata);

    //Gson gson = new Gson();                   // 整形なし    
    Gson gson = new GsonBuilder().setPrettyPrinting().create();   // 整形
    String gsonstr = gson.toJson(grid);

    // ++ レスポンスを返す ++ //
    try {
      byte[] res = gsonstr.getBytes("UTF-8");   // <=== UTF-8にしないと文字化けする
      response.setContentType(CONTENT_TYPE);
      response.setContentLength(res.length);
      OutputStream os = response.getOutputStream();
      os.write(res);
      os.close();
    }
    catch (Exception e) {
      e.printStackTrace();
    }

応答文字列


{
  "page": 1,
  "total": 1,
  "records": 1,
  "rows": [
    {
      "id": 182077,
      "vessel": "APL CHINA",
      "voy": "221W",
      "ss": "APL",
      "port": "Yokohama",
      "dt_atb": "01/01 (Sat)",
      "dt_atd": "01/01 (Sat)",
      "dt_imp": "11/15 (Thu)",
      "rt_imp": 116.65,
      "dt_exp": "11/15 (Thu)",
      "rt_exp": 116.65,
      "tm_add": "12/02 08:28",
      "url_link": "http://aplinfo.apl.com/japan/html/daily_schedule.html"
    }
  ]
}

gson エンコード サンプルコード 単レコード

[ 単純クラスオブジェクト ]




import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
    // curlをRunTimeで実行 //
    Forecast fc = PF.getCurrentForecast();
    
    // UTC => MyTM 変換があるのでクラスに入れたのを文字列に戻す //
    //Gson gson = new Gson();                                      // 整形なし
    Gson gson = new GsonBuilder().setPrettyPrinting().create();    // 改行整形
    String gsonstr = gson.toJson(fc);

応答テキスト


{
  "DESTINATION": "JP TYO R",
  "ETA": "19/01/07 07:00 (UTC)",
  "ETA_CALC": "19/01/09 06:31 (UTC)",
  "ETA_MY": "19/01/07 16:00 (Asia/Tokyo)",
  "ETA_CALC_MY": "19/01/09 15:31 (Asia/Tokyo)",
  "NEXT_PORT_NAME": "TOKYO",
  "NEXT_PORT_UNLOCODE": "JPTYO",
  "LAST_PORT": "SHANGHAI",
  "nowtmjst": "19/01/04 14:22 (JST)",
  "cdCntryLast": "CN",
  "cdCntryNext": "JP"
}

jsoup connect の仕方

[ 基本 ]
URL をセットして get すればよい


final String URL = "http://xxxxx/yyy";
Document jsdocall = Jsoup.connect(URL)
                .get();

[ 実践 ]
プロキシ、ユーザーエージェント、ヘッダー、リファラーをセット


  private final String USER_AGENT
          = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36";

  private final String HEADER_ACCEPT = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
  private final String HEADER_ACCEPT_LANG = "ja,en-US;q=0.7,en;q=0.3";
  private final String HEADER_ACCEPT_ENCODING = "gzip, deflate, br";
  private final String HEADER_REFERER = "https://www.xxxxx/yyyy";

Document jsdoc = Jsoup.connect(this.kwurl)
                .proxy(this.proxyHost, this.proxyPort)
                .userAgent(USER_AGENT)
                .header("Accept", HEADER_ACCEPT)
                .header("Accept-Language", HEADER_ACCEPT_LANG)
                .header("Accept-Encoding", HEADER_ACCEPT_ENCODING)
                .header("Referer", HEADER_REFERER)
                .timeout(10 * 1000)
                .get();

MyBatis 使って何がうれしいか

業務システムでデータベースは必須と思います。

データベースといえば、SQLが必須と思います。

昔、Java始めた頃は、iBatisもMyBatisもなかったので、Javaに標準についてるjavax.sql使ってJDBC介して操作してましたので、SQLを直接ソースコードにべた書きしたり、プロパティファイルから読んだり、独自テキストファイルに記述されたのを読んだりしていて、

かなり統一性に欠ける、メンテナンス性の悪い、後で苦労することしてました。

iBatis (MyBatisの前身)を知ってから、

コードが大変短くなり、SQLをまとめて分類して置いておけ、やりたい事がJavaコードに制約されず、簡潔に速くできるようになりました。

MyBatisのxml内で、条件分岐、パラメータ以外のメタ文字も指定できるので、プログラム側で行うか、静的に行うかの選択肢が増えて、ケースバイケースな事がしやすくなります。

xml内if利用例


  <!-- 商品マスタアップロードエクセル列マッピングリスト -->
  <select id="selExcelMapList" parameterType="ParamMstMnt" resultMap="ExcelMapMap">
    
    SELECT
      ID, m.IDX_EXCEL, 
      fc_sel_columntitle('goodslist', m.NM_TBLFLD, #{cdLang}) AS NM_EXCELTXT,
      m.NM_TBLFLD, 1 AS FLG_CHECKED, 
      fc_sel_columnfld('goodslist', m.NM_TBLFLD) AS NM_JAVAFLD,
      c.NM_FORMATTER
    FROM
      m_defupldclms m
      INNER JOIN m_jqcolumn c ON (m.NM_TBLFLD = c.NM_TBLFIELD AND c.ID_GRID = 'goodslist')
    WHERE
      1 = 1 
    <if test="!isSK">
      AND c.IS_EDITABLE_CUST = 1 OR c.NM_TBLFIELD = 'CD_JAN'
    </if>    
    
    ORDER BY ID
  </select>

gson 使って何がうれしいか

Javascript + AJax でのフロントエンドが主流となってきて、受信データ型式がJSONが普通と思います。

主に、jqGridのデータ取得バックエンドのJavaで使ってます。

PHPとかでは、JSONへのエンコードが、すぱっとワンステートメントで出来るところ、gsonの存在がわからぬ頃、StringBuffer にJavaオブジェクトのデータをgetして追加、文字列にして応答するという、煩雑で間違いやすく、メンテナンス性の悪い方法を使ってました。

gson使ってからは、JSON型式文字列への変換が、単純配列、単純リストはもちろん、JavaBeanのリストなんかもワンメソッドで出来、コード量削減、間違い減少、メンテナンス性大幅向上してます。

リフレクション使えば、デコードも短いコードでさっと出来て、JSON型式でのリクエストパラメータなんかも簡単に扱えます。