[ https://issues.apache.org/jira/browse/WW-4176?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16133144#comment-16133144 ]
Yasser Zamani commented on WW-4176: ----------------------------------- [~lukaszlenart] my four years ago understanding was very wrong :) By my today several hours work, I think you can close this issue as not a problem! [~sabendroth]'s codes not work because it is not a duty for $.getJSON to set {{Content-Type}} to {{application/json}}, so, Struts JSON Plugin just ignores it for any further processing ([reference|https://struts.apache.org/docs/json-plugin.html])! My following modified configuration works for me: JSP PAGE: {code:xml} <%@taglib prefix="s" uri="/struts-tags"%> <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>WW-4176</title> </head> <body> <form action="" id="testForm1"> <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> testForm1<input type="submit"/> </form> <script> $("#testForm1").submit(function(event){ event.preventDefault(); //Cancel the default action (navigation) of the click. var token = $("input[name='_csrf']").val(); var data={"1":"1","2":"ANOTHERVALUE","ANOTHERKEY":"1","KEY":"VALUE"}; var sentData={"myJSONMap":data}; $.ajax({ type: "POST", url: "<s:url namespace="/" action="testMap"/>", contentType: "application/json; charset=utf-8", dataType: "json", data: JSON.stringify(sentData), headers: { 'X-CSRF-TOKEN':token }, success: function(json) { alert("Client generated JSON"+JSON.stringify(json)); }, error: function (xhr, textStatus, errorThrown) { alert(xhr.responseText); } }); }); </script> </body> </html> {code} JSON Action config: {code:xml} <package name="default" namespace="/" extends="struts-default,json-default"> <action name="testMap" method="testMap" class="me.zamani.yasser.ww_convention.actions.JSON_DropDownPropertyValuesAction"> <interceptor-ref name="json"></interceptor-ref> <result name="success" type="json"> <param name="noCache">true</param> </result> </action> </package> {code} > 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 > Assignee: Lukasz Lenart > Fix For: 2.5.x > > 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.4.14#64029)