[
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)