JavaのWebアプリケーション開発フレームワークによる、Webサイト開発の顛末記です。

EclipseのMavenを使った、Spring-MVC、Thymeleaf、MyBatis 等のプログラミングテクニックを、
備忘録的に記録しています。実際に動くソースコードを多用して説明していますので、
これからEclipseや、Spring-MVCを始めたいと思っている人にとって、少しでも参考になれば幸いです。
Spring-MVCの散歩道 > 応用の森(JSON編) > JSONデータ構造から動的クラス生成

package jp.dip.arimodoki.blogic;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import jp.dip.arimodoki.common.CConst;
import jp.dip.arimodoki.common.JsonConvertIf;
import jp.dip.arimodoki.mapper.PrefMap;
import jp.dip.arimodoki.model.FormZipIf;
import jp.dip.arimodoki.model.JsonReqAreaIf;

/**
* 都道府県情報をDBから検索するビジネスロジッククラスです。
*/
@Service
public class BlZip implements CConst, BlZipIf {

    //都道府県情報Mapper DI
    @Autowired
    private PrefMap prefMap;

    //JSON パーサー/ジェネレータ DI
    @Autowired
    private JsonConvertIf jsonConvert;

    //都道府県検索情報フォームビーン
    private FormZipIf               formZip;
    private JsonReqAreaIf       jsonReqArea;        //JSONリクエストパラメータ

    /**
     * フォームBeanの継承
     * アクションコントローラで取得したFormBeanを継承する
     * @param form 都道府県検索情報フォームビーン
     */
    public void setForm(FormZipIf form) {
        this.formZip = form;
    }

    /**
     * 都道府県情報リストをDBから取得し
     * 取得したJSON構造から動的Classを生成して、フォームBeanにセットする
     * @throws エラーが発生した場合はExceptionをスローします
     */
    @Transactional(readOnly=true)               //DBトランザクション状態設定(read only)
    public void getJPrefList() throws Exception {
        //リクエストパラメータを取得
        jsonReqArea = this.formZip.getJsonReqArea();
        //リクエストパラメータ(地域コード)取得
        String areaCd = jsonReqArea.getAreacd();

        //都道府県情報DB検索(JSON構造を返す)
        String preflist = prefMap.getPrefList(areaCd);
        //返却値は "[{key1:val1},{key2,val2},{key3,val3},....]" 形式で返るので
        //これをDeserializeすると変換エラーが発生する
        //Deserializeを通すために、キーを付与して、{}でくくる
        String plst = "{\"preflist\":" + preflist + "}";
        // plst = "{key:[{key1:val1},{key2,val2},{key3,val3},....]}"
        //キー:preflist は、クラスのプロパティ名となるので、後でこれでオブジェクトを検索する

        //JSON構造を動的クラスにデシリアライズ(並列化=Class Object化)する
        Object prefObj = jsonConvert.Deserialize(plst, "pList");
        //デシリアライズされた動的Classオブジェクトは、List<?> prefList の配列になっている
        //List<?> prefListのObjectをプロパティ名(preflist)で検索して取得する
        Object o = jsonConvert.getObject(prefObj,"preflist");
        //フォームBeanに動的オブジェクトをセット
        formZip.setPrefList(o);
    }
}