2009-04-07
SAStruts JSONを返すアクションメソッド 修正編
SAStruts アクションにJSONを返すメソッドを作成してみる - 130単位
↑で書いたコードに対し、気になった点があって直そうと思いました。が、あまりに修正点が多かったので新たに記事にしてみます。
以前のコード
Ajaxでリクエストされ、従業員のリストをJSON形式で返すメソッドです。
@Execute(validator = false) public String ajaxEmployeeList() { List<Employee> employeeList = employeeService.findByDeptId(form.departmentId); HashMap<String, String> map = new HashMap<String, String>(); for (Employee emp: employeeList) { map.put(emp.id, emp.name); } ResponseUtil.write(JSONSerializer.serialize(map), "text/javascript"); return null; }
修正4点
Mapの順序を固定する
HashMapだと、値の順序が保証されません。実際にJSON文字列ではバラバラになってしまっていて、受け側のJavaScriptで扱う際にも影響が出ていました。
HashMap<String, String> map = new HashMap<String, String>();
↓
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
これで、putした順序通りにJSONに変換されます。ただし期待する結果を得るためには、employeeService#findByDeptId()での照会の際にOrderBy()を利用してソートしておくことが必要です。
また、Mapにはキーの値で自動的にソートされるTreeMapという実装もあるようです。こちらなら、OrderBy()しておく必要はなさそうです。パフォーマンスも含めてどちらが適しているかは未調査です…。
インタフェース型で宣言する
変数などの宣言には、インタフェースを用いるのが良いようです。
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
↓
Map<String, String> map = new LinkedHashMap<String, String>();
大きな理由としては、コードに柔軟性を持たせるためだと認識しています。『Effective Java』が詳しいです*1。
JSONICを使う
前の記事でも触れましたが、JSONSerializerは@deprecatedとなっているため、JSONICを利用します。
JSONSerializer.serialize(map)
↓
//import net.arnx.jsonic.JSON; が必要
JSON.encode(map)
Content-Typeを「application/json」にする
RFCで定められているように、"application/json"を使うことにします。
修正したコード
以上4点を修正したコードです。
@Execute(validator = false) public String ajaxEmployeeList() { List<Employee> employeeList = employeeService.findByDeptId(form.departmentId); Map<String, String> map = new LinkedHashMap<String, String>(); for (Employee emp: employeeList) { map.put(emp.id, emp.name); } ResponseUtil.write(JSON.encode(map), "application/json"); return null; }
ついでに
これまでの記事で、「デパート」→「部署」に変えておきした。常識的な英語表現っぽくてなんとなく恥ずかしかったので。
*1:第8章 項目52
トラックバック - http://d.hatena.ne.jp/deeeki/20090407/sastrutsjson2
リンク元
- 79 http://www.google.co.jp/url?sa=t&rct=j&q=sastruts json&source=web&cd=2&ved=0CCUQFjAB&url=http://d.hatena.ne.jp/deeeki/20090407/sastrutsjson2&ei=AImETqS7FMjbmAW6t4kj&usg=AFQjCNHvO1bBAu3fcWmRIWpgB-zaMTacVw&sig2=oqFXxIADvz4IZ3PiZ7rvLg&cad=rja
- 54 http://www.google.co.jp/search?q=sastruts+json&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 48 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCIQFjAA&url=http://d.hatena.ne.jp/deeeki/20090407/sastrutsjson2&ei=jsccT9GRC6_5mAW9neGsCw&usg=AFQjCNHvO1bBAu3fcWmRIWpgB-zaMTacVw
- 38 http://www.google.co.jp/url?sa=t&rct=j&q=sastruts+json&source=web&cd=2&ved=0CCYQFjAB&url=http://d.hatena.ne.jp/deeeki/20090407/sastrutsjson2&ei=FR3TTryeFO3umAXElsC9DQ&usg=AFQjCNHvO1bBAu3fcWmRIWpgB-zaMTacVw
- 34 http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q=sastruts+json
- 33 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4SUNA_jaJP284JP284&q=130単位
- 26 http://b.hatena.ne.jp/entry/d.hatena.ne.jp/deeeki/20090407/sastrutsjson2
- 26 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=Yj0&q=json+java&btnG=検索&lr=lang_ja
- 20 http://www.google.co.jp/search?q=sastruts+json&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 17 http://www.google.co.jp/search?aq=f&sourceid=chrome&ie=UTF-8&q=sastruts+json



