質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.11%

JSONデータをjavaに変換

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,360

score 12

お世話になってます
現在ajaxの非同期通信で送られてきたjsonデータをjavaで取り扱えるように変換を行っているのですがうまくいきません。jsonで送られてきた文字列のキー(name)に対応するフィールドをjava側のクラスで宣言してそこに値を格納して利用したいのですが、うまくjava側に値が入りません。パーサーライブラリーはGSONを用いています。

以下ソースコードです

jsonの値を格納するJavaクラス

package jp.co.xmd.form;

public class MonthLessonSerchForm {


    private String LessonRoomNameValue;
    private String InstructorNameValue;
    private String YearValue;
    private String MonthValue;
    private String LessonNameValue;

    public String getLessonNameValue() {
        return LessonNameValue;
    }
    public void setLessonNameValue(String lessonNameValue) {
        LessonNameValue = lessonNameValue;
    }
    public String getLessonRoomNameValue() {
        return LessonRoomNameValue;
    }
    public void setLessonRoomNameValue(String lessonRoomNameValue) {
        LessonRoomNameValue = lessonRoomNameValue;
    }
    public String getInstructorNameValue() {
        return InstructorNameValue;
    }
    public void setInstructorNameValue(String instructorNameValue) {
        InstructorNameValue = instructorNameValue;
    }
    public String getYearValue() {
        return YearValue;
    }
    public void setYearValue(String yearValue) {
        YearValue = yearValue;
    }
    public String getMonthValue() {
        return MonthValue;
    }
    public void setMonthValue(String monthValue) {
        MonthValue = monthValue;
    }



}


コントローラークラスです(使用しているメソッドのみ抜粋)

public String Search(String Arr2){
        System.out.println(Arr2);//非同期通信で送られてきたjson文字列を表示している(結果は後で載せます)


        Gson gson = new Gson();//Jsonに変換するためのクラスのインスタンスを生成。

        MonthLessonSerchForm user = gson.fromJson(Arr2.toString(),
                MonthLessonSerchForm.class);//jsonデータを変換して上記のjavaクラスに格納している?
        System.out.println(user);//チェック用の表示 何も表示されず。。。
        System.out.println("LessonRoomNameValue = " + user.getLessonRoomNameValue());//同じくチェック用 フィールドの値を参照している


        return Arr2;
    }

非同期通信で送られてきたjsonデータです

[{"name":"LessonNameValue","value":"1"},{"name":"LessonRoomNameValue","value":"1"},{"name":"InstructorNameValue","value":""},{"name":"YearValue","value":"2013"},{"name":"MonthValue","value":"3"}]

どうかよろしくお願いします
不足があったら申し付けてください。追記します

追記(うまく<form>タグの内容をjsonにできていないみたいなので使っているコードを追記します。不足があったら申し付けてください。追記します)

HTML (セレクトボックスの内容はデータベースから拾ってます)

<f:form modelAttribute="DayLessonSearchFormMenu" action="${pageContext.request.contextPath}/day_lesson_search" class="form-inline" method="POST">
                        <div class="row">
                            <div class="form-group col-lg-2 col-md-2 col-xs-12">
                                <label>レッスン名</label>
                            </div>
                            <div class="form-group col-lg-2 col-md-2 col-xs-12">
                                <f:select path="LessonNameValue" items="${lessonNameList}"
                                    itemLabel="LessonNameLabel" itemValue="LessonNameValue" class="form-control">
                                </f:select>
                            </div>
                            <div class="form-group col-lg-2 col-md-2 col-xs-12">
                                <label>教室名</label>
                            </div>
                            <div class="form-group col-lg-2 col-md-2 col-xs-12">
                                <f:select path="LessonRoomNameValue" items="${lessonRoomNameList}"
                                    itemLabel="LessonRoomNameLabel" itemValue="LessonRoomNameValue" class="form-control">
                                </f:select>
                            </div>
                            <div class="form-group col-lg-2 col-md-4 col-sm-6 col-sm-12">
                                <label>担当講師名</label>
                            </div>
                            <div class="form-group col-lg-2 col-md-4 col-sm-6 col-sm-12">
                                <f:select path="InstructorNameValue" items="${instructorNameList}"
                                    itemLabel="InstructorNameLabel" itemValue="InstructorNameValue" class="form-control">
                                </f:select>
                            </div>
                        </div>
                        <div class="row">
                            <div class="form-group col-lg-2 col-md-2 col-sm-3 col-xs-12">
                                <label>レッスン実施年</label>
                            </div>
                            <div class="form-group col-lg-2 col-md-2 col-sm-3 col-xs-12">
                                <f:select path="YearValue" items="${yearList}"
                                    itemLabel="YearLabel" itemValue="YearValue" class="form-control">
                                </f:select>
                            </div>
                            <div class="form-group col-lg-2 col-md-2 col-sm-3 col-xs-12">
                                <label>レッスン実施月</label>
                            </div>
                            <div class="form-group col-lg-2 col-md-2 col-sm-3 col-xs-12">
                                <f:select path="MonthValue" items="${monthList}"
                                    itemLabel="MonthLabel" itemValue="MonthValue" class="form-control">
                                </f:select>
                            </div>

                        </div>
                        <div class="row">
                            <div class="form-group col-lg-2 col-md-4 col-sm-6 col-sm-12">
                                <label>実施時間</label>
                            </div>
                            <div class="form-group col-lg-6 col-md-4 col-sm-6 col-sm-12">
                                <input type="text" class="form-control" placeholder="00:00"><input type="text" class="form-control"placeholder="23:59">
                            </div>
                            <div class="form-group col-lg-4 col-md-4 col-sm-6 col-sm-12">
                                <input type="submit" class="btn btn-default form-control
                                    search_button" value="検索">
                            </div>
                        </div>
                    </f:form>


非同期通信と<form>の内容をjsonにして送るjavascriptです

$('[value=検索]').click(function() {
        $('form').submit(function(event) {
            event.preventDefault();
            var lessonArr = $('form').serializeArray();
            alert(JSON.stringify(lessonArr));
            $('[value=検索]').attr('disabled', true);
            $.ajax({


                type : "GET",
                url : "lesson_search", // リクエストURL
                data : "lessonArr2=" + JSON.stringify(lessonArr),
                datatype: "json",
                success: function(data){
                    alert("ok");
                    console.log(data);
                    $('[value=検索]').attr('disabled', false);
                    location.reload();
                },
                 error: function(data){
                        alert("値はコンソール参照");
                        $('[value=検索]').attr('disabled', false);
                        location.reload();
                    }

            });
        });
  });
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

JSONのプロパティとjavaのフィールド名を合わせる必要があるようです。
あと、JSONが配列で返ってきているので、そこも注意です。

以下、ローカルで試したものを貼りますので、参考にしてください。

public class Lesson {

    private String name;
    private String value;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }

}
public class Test {

    public static void main(String[] args) {

        StringBuilder s = new StringBuilder();
        File file = new File("resource/teratail48130data.json");
        try (BufferedReader br = new BufferedReader(new FileReader(file))) {
           String line = null;
           while ((line = br.readLine()) != null) {
               s.append(line);
            }
        } catch (FileNotFoundException e) {
            System.out.println("ファイルが存在しません。");
        } catch (IOException e) {
            System.out.println("エラーが発生しました。");
        }
        Gson gson = new GsonBuilder().serializeNulls().create();
        Lesson[] lessons = gson.fromJson(s.toString(), Lesson[].class);

        for (Lesson l : lessons) {
            System.out.println(l.getName() + "," + l.getValue());
        }

    }

}

結果

LessonNameValue,1
LessonRoomNameValue,1
InstructorNameValue,
YearValue,2013
MonthValue,3

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/16 09:37

    遅れてすみません
    回答ありがとうございます!
    一応jsonで送られてくるデータのname(キー?)に対応する値をjava側のプロパティに設定しました。配列に関してなんですがhtmlの<form>タグの中身をjsonとして送りたいのですが只の文字列にすると一つの要素しかとってこないので配列にしなきゃダメなのかなーと。。。使用しているjqueryとHTMLのコードを追記しますので良かったら教えて頂けると幸いです

    キャンセル

  • 2016/09/16 13:16

    「input要素にname属性を付ける」という方法で良いと思います。

    キャンセル

0

jsonデータのフォーマットが誤っているように思えます。
以下のようにしてみてはどうでしょうか?

{"LessonNameValue":"1",
 "LessonRoomNameValue":"1",
 "InstructorNameValue":"",
 "YearValue":"2013",
 "MonthValue":"3"
 }

参考:
http://qiita.com/u-chida/items/cbdd040e4199a10936dc


formのjson変換について

jQueryのプラグインの導入が可能なら、以下のサイトで紹介されている方法がよさそうです。
http://d.hatena.ne.jp/hiro_nemu/20090826/1251284397

プラグインの導入が無理な場合は、以下のような形で行けると思います。
※申し訳ないですが、動作確認はしていません。
※value値に「"」や改行などがある場合は、別途エスケープ処理が必要になります。

var jsonStr = '{';
$($('form').serializeArray()).each(function(i, param) {
     if (i != 0) {
         jsonStr += ',';
     }
     jsonStr += '"' + param.name + '":"' +  param.value + '"';
});
jsonStr += '}';

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/16 09:32

    返事遅れてすみません
    回答ありがとうございます!
    jsonのフォーマットについてですがhtmlの<form>タグの内容をjqueryを用いてjsonにしてjavaに送る方法を調べて使っていたのですが違うみたいですね。。。使用しているhtmlとjqueryのコードを追記するので差支えなければ<form>タグの中身をきちんとjsonとして送る方法を教えて頂けると幸いです

    キャンセル

  • 2016/09/16 11:02

    json変換について追記しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る