[
https://issues.apache.org/jira/browse/WW-4176?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Yasser Zamani updated WW-4176:
------------------------------
Attachment: WW-4176-proposal.patch
Maybe we can have an improvement for {{ParametersInterceptor}}!
I attached a proposal patch as my suggestion. After applying that,
{{ParametersInterceptor}} tries to fix parameter names by covering string
indices with single-quotes e.g [2a_z] -> ['2a_z'].
I tested it with latest code and works as expected.
> Struts2 JSON Plugin: Send Map with Strings as Key to JSON Action is ignored,
> Numeric Keys will work and mapped
> --------------------------------------------------------------------------------------------------------------
>
> Key: WW-4176
> URL: https://issues.apache.org/jira/browse/WW-4176
> Project: Struts 2
> Issue Type: Bug
> Components: Plugin - JSON
> Affects Versions: 2.3.14.3
> Environment: Tomcat6, Struts 2.3.14.3,JSON Plugin 2.3.14.3,jquery
> Reporter: Stefan Abendroth
> Fix For: 2.3.17
>
> Attachments: WW-4176-proposal.patch
>
>
> Sending Map from javascript/jsp to JSON Action, when the Keys are numeric
> everything works, when the keys are Strings then these entries are thrown
> away while the mapping process in the JSON Action takes place.
> Important note: If i create a map in the JSON Action and send it to the
> client everything is ok.
> alert which shows the Server generated JSON:
> {noformat}
> ServerJSON{"1":"1","2":"ANOTHERVALUE","ANOTHERKEY":"1","KEY":"VALUE"}
> {noformat}
> If i look into the sended data from javascript side in Eclipse i see in debug
> mode:
> {noformat}
> this=>myJSONMap:{2=[Ljava.lang.String;@3caf7a1f,
> 23=[Ljava.lang.String;@247aa859}
> {noformat}
> Alert shows on client side:
> {noformat}
> ClientJSON{"2":["ANOTHERVALUE"],"23":["1"]}
> {noformat}
> Hope it's clear where the problem is. Bug or misunderstood anything?
> Would like to have a List of keys,values where the keys can be
> String/Long/Int and the values can be String/Long/int.
> The direction Server generated Map=>JSON is ok, sending the same from client
> side will lose the entries with a String key.
> Further i tried also to specify my Map like
> {code:java}
> private Map<String, String> propertyValueMap = new LinkedHashMap<String,
> String>();
> {code}
> and set the getters/setters but don't work either.
> Here is a part of my code:
> JSP PAGE:
> {code:html}
> <form action="" id="testForm1">
> testForm1<input type="submit"/>
> </form>
> <script>
> $("#testForm1").submit(function(event){
> event.preventDefault(); //Cancel the default action (navigation) of the click.
> var data={"1":"1","2":"ANOTHERVALUE","ANOTHERKEY":"1","KEY":"VALUE"};
> var sentData={};
> sentData["myJSONMap"]=data;
> $.getJSON("<s:url namespace="/ajax" action="testMap"/>", sentData
> ,function(data3) {
> alert("Server generated JSON"+JSON.stringify(data3.mymap));
> alert("Client generated JSON"+JSON.stringify(data3.myJSONMap));
> });
> });
> {code}
> JSON Action config:
> {code:xml}
> <struts>
> <package name="PIM_JSONDataPackage" namespace="/ajax"
> extends="struts-default,json-default">
> <action name="testMap" method="testMap"
> class="eu.mtd.actions.JSON_DropDownPropertyValuesAction">
> <result type="json" />
> <param name="noCache">true</param>
> </action>
> </package>
> </struts>
> {code}
> JSON Action
> {code:java}
> public class JSON_DropDownPropertyValuesAction extends ActionSupport{
> private static final long serialVersionUID = 1L;
> private Map session;
> @SuppressWarnings("rawtypes")
> private Map mymap = new HashMap();
> @SuppressWarnings("rawtypes")
> private Map myJSONMap = new HashMap();
> public JSON_DropDownPropertyValuesAction(){}
> @SuppressWarnings("unchecked")
> public String testMap(){
> mymap.put("KEY", "VALUE");
> mymap.put("1", "1");
> mymap.put("ANOTHERKEY", "1");
> mymap.put("2", "ANOTHERVALUE");
> //Creates JSON:
> {"1":"1","2":"ANOTHERVALUE","ANOTHERKEY":"1","KEY":"VALUE"}
> return SUCCESS;
> }
> public String execute() {
> return SUCCESS;
> }
> @SuppressWarnings("rawtypes")
> public Map getMymap() {
> return mymap;
> }
> @SuppressWarnings("rawtypes")
> public void setMymap(Map mymap) {
> this.mymap = mymap;
> }
>
> @SuppressWarnings("rawtypes")
> public Map getMyJSONMap() {
> return myJSONMap;
> }
>
> @SuppressWarnings("rawtypes")
> public void setMyJSONMap(Map myJSONMap) {
> this.myJSONMap = myJSONMap;
> }
> public Map getSession() {
> return session;
> }
> public void setSession(Map session) {
> this.session = session;
> }
> {code}
--
This message was sent by Atlassian JIRA
(v6.1#6144)