goo blog サービス終了のお知らせ 

ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

(連想配列の配列ではなく)連想配列の大きさとキーでのソート

2015-09-29 18:33:44 | JavaとWeb
いま、HashMapを、JSON形式にして、送るとする。
プログラムは、こんかなんじ。

結果、JSONは、こんなかんじ。

これをAJAXで受けると、こんな問題が起きる。




■問題

(1)HashMapは連想配列に入るが、その連想配列の大きさが分からないので、
   ループがまわせない

  【解決策】
   for(key in data) の形でまわせば、大きさが要らない。
   だから、回りはする。でも、

(2)for(key in data) の形でまわすと、順番が狂う
  →そもそも、HashMapに順番がない。
  →Javascript側でも、JSONを連想配列に変換した場合、
   順番は本来は、どうでもいいことになっているようだ・・・
  →連想配列の配列でなく、連想配列そのものを、ソートして出したい。

【参考】 
PHPと異なり,JavaScriptの連想配列とfor in構文には順序の概念がないので注意すること
http://d.hatena.ne.jp/TipsMemo+computer-technology/20140601/p1




■コレに対する、世論

 Webを見ると、大きく2つの主張がされています。

(1)連想配列のソートは可能
  →多くのケースでは、連想配列を配列に入れて、それをソートしている
  →今回は連想配列そのものを順番に出そうという話なので、このケースではない

(2)連想配列のソートは不可能
  たとえば、以下のサイトでは、そう主張している

  連想配列のソート
  http://xn--l8j3bvb4foc.jp/contents/javascript/jsmemo4.htm

これらの方法とは違う方法で、出来ます。




■解決法

 キーだけを、配列で取ってくる方法があります

  keys = Object.keys(data);

 大きさを知りたい場合は、keys.lengthで分かります。

 キーをソートしたい場合はkeys.sort()でソートします。
 ソートした結果を取り出したい場合は、

 のようなかんじで取り出せます。結果は、こんなかんじ


【参考】
javascript 連想配列(オブジェクト)の要素数が知りたい。
http://chaika.hatenablog.com/entry/2014/08/07/103459

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Struts2でJSONで返したい(RESTっぽくしたい)その2 struts.xmlを使う

2015-09-29 13:13:38 | JavaとWeb
前に

Struts2でJSONで返したい(RESTっぽくしたい)
http://blog.goo.ne.jp/xmldtp/e/e1bf4ddc8fdace75f0ee1c7226ef4f88

を書いたけど、そのときは、ゼロ・コンフィグレーション(struts.xml)
だった。struts.xmlを記述する方法は、


Struts2でレスポンスをjsonにする方法
http://sugiim.hatenablog.com/entry/2013/02/21/190000

にあるけど、
・具体的に、struts.xmlをどう書くか?
・Action側はどう書くか
について書いていないので、今回は、そのお話を少し・・・




■お題
hello.actionを呼び出したら、
ハッシュマップ(というか連想配列で)
  englishはHello world
  japaneseはこんにちは世界
とJSON形式で返る、つまり

っていうのを作成する




■変更点
 ふつうのStruts2と違うのは、
・struts2-json-pluginを入れる
・struts.xmlの書き方
・Actionの書き方
なので、この点についてだけ、ソースを出して記述します
(あとのweb.xmlの配置などは、ふつうのStruts2と同じなので省略)




■struts2-json-pluginを入れる

上記の「Struts2でレスポンスをjsonにする方法」で、「プラグイン追加」
のところ。そこでは、mavenを使っているからpom.xmlを修正しているけど、
ここでは、手作業でやってみる。

mavenはmavenリポジトリ(http://mvnrepository.com/)からとってくる。
今回は、mavenリポジトリのstruts2-json-plugin

http://mvnrepository.com/artifact/org.apache.struts/struts2-convention-plugin

の中から、下にスクロールすると、適当に新しいのがあるので、
好き勝手に選んで、バージョン番号(例えば2.3.24.1)をクリック
変わった画面で、

downloadをクリック

ダウンロードしたjarを、WEB-INF/libの下にコピーします(他のjarと要領は一緒)




■struts.xml

結局、こうなります。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <package name="hello" namespace="/" extends="json-default">
	<result-types>
		<result-type name="json" class="org.apache.struts2.json.JSONResult"/>
	</result-types>
        <action name="hello" class="struts2.gui.HelloAction">
        	<result name="success" type="json">
			<param name="root">msg</param>
		</result>
        </action>
    </package>

</struts>

上記の例は、「struts2.gui.HelloAction」というクラスにexecute()があって、
そのクラスのアトリビュートにmsgがあり、そのmsgをJSON形式で送る場合の指定
(リターンがsuccessのときに)




■Actionの書き方
上記例で指定した、struts2.gui.HelloActionは、こんなかんじ。

import java.util.HashMap;
import com.opensymphony.xwork2.ActionSupport;

//==============================================//
// JSONのサンプル //
//==============================================//
public class HelloAction extends ActionSupport{
private HashMap<String,String> msg;

public HashMap<String,String> getMsg() {
return msg;
}

public void setMsg(HashMap<String,String> msg) {
this.msg = msg;
}

public String execute()
{

HashMap<String,String> map = new HashMap<String,String>();

map.put("english","Hello World");
map.put("japanese","ようこそ世界");

setMsg(map);

return SUCCESS;
}
}


JSONで返す値(struts.xmlのresultタグ内のparamタグで指定)を
宣言し、アクセサ(setter,getter)をつけることと、

値をセットしたら、successでリターンしていること




こんなところかな・・・

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする