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

Reply via email to