Struts2通过json前后台传数据的问题

bean如下

public class User implements Serializable
{
    private static final long serialVersionUID = 9093919302451530682L;
    private String name;
    private String password;
}

 前台传得json格式如下

var date={
             "userName":"1111",
             "password":"2222",
             "user":{
                 "name":"3333",
                 "password":"4444"
             }
     };

 action里

 
public class LoginAction implements Action
{
     private User user;
     private String userName;
     private String password;
     public String execute() throws Exception
    {
        System.out.println(userName);
        //userName值"1111"
        System.out.println(password);
        //password值"2222"
        System.out.println(user.toString());
        //user对象为null,这里怎么获取json对象并转User对象     
        return Action.SUCCESS;
      
    }
}

 json的jar包有:

 json-lib-2.4-jdk15.jar

 jsonplugin-0.34.jar

你前台的json要组装成下面的格式,传入后台struts2才能被正确封装。
[code="javascript"]
var date={

"userName":"1111",

"password":"2222",

"user.name":"3333",

"user.password":"4444"
};
[/code]



success,id

[code="java"]



success,id


[/code]

使用struts2本身自带的json-lib 配置下就OK啦

[code="java"]

public class LoginAction implements Action ,ModelDriven
{

private User user;

private String userName;

private String password;

public String execute() throws Exception

{

System.out.println(userName);

//userName值"1111"

System.out.println(password);

//password值"2222"

System.out.println(user.toString());

//user对象为null,这里怎么获取json对象并转User对象

return Action.SUCCESS;

}  

@Override  
public User getModel(){  
    return user;  
}    

//... property's getter/setter

}

//前台:

//userName
//passowrd

//User对象的两个属性

[/code]

你需要做转换,你直接通过这样方式就可以直接从前台转换得到,你直接去user对象即可。注意modeldriven的继承很重要

你干吗前台传json格式 如果这样 你可以试下 jsonToArray jsonToObject 方法

如果楼主使用的JSON lib的话,

String json = "你的JSON串";
JSONObject obj = JSONObject.fromObject(json);
User user = (User)JSONObject.toBean(obj, User.class)

建议楼主使用JacksonJson包来处理Json数据,下面是以前写的一个代码,需要jackson包和xstream包

[code="java"]import java.io.StringWriter;

import net.sf.json.JSON;
import net.sf.json.xml.XMLSerializer;

import org.apache.commons.lang.StringUtils;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.map.MappingJsonFactory;
import org.codehaus.jackson.type.TypeReference;

import com.thoughtworks.xstream.XStream;

/**

  • XML/JSON转换处理工具类
  • @author surfren
  • @version 1.0
  • @created 2010-10-19 下午02:50:21
    /
    public class XMLJsonUtils {
    /
    *

    • Object对象转换为JSON格式
    • 例如List对象、JavaBean对象、JavaBean对象数组、Map对象、List Map对象
    • @param object 传入的Object对象
    • @return object的JSON格式字符串
      */
      public static String toJson(Object object) {

      // Jackson方式转换为Json
      MappingJsonFactory f = new MappingJsonFactory();
      StringWriter sw = new StringWriter();

      try {
      JsonGenerator generator = f.createJsonGenerator(sw);
      generator.writeObject(object);
      generator.close();

      } catch (Exception e) {
      return "";
      }
      return sw.toString();

    }

    /**

    • Object对象转换为XML格式
    • @param object 传入的Object对象,例如List对象、JavaBean对象、JavaBean对象数组、Map对象、List Map对象
    • @return object的XML格式字符串 */ public static String toXML(Object object) { String retXML = ""; XStream xstream = new XStream(); xstream.setMode(XStream.NO_REFERENCES); retXML = xstream.toXML(object); return retXML; }

    /**

    • XML转换为JSON
    • @param xmlString XML格式字符串
    • @return Json格式字符串 */ public static String xmlToJson(String xmlString) { XMLSerializer xmlSerializer = new XMLSerializer(); xmlSerializer.setSkipNamespaces(true); JSON json = xmlSerializer.read(xmlString); return json.toString(3);

    }

    /**

    • JSON转换为Object对象
    • @param jsonString JSON字符串
    • @param c 要转换成的类的类型
    • @return Object对象
      */
      public static T jsonToObject(String jsonString, Class c){

      if (StringUtils.isEmpty(jsonString)) {
      return null;

      } else {

      // Jackson方式将Json转换为对象
      MappingJsonFactory f = new MappingJsonFactory();
      try {
          JsonParser parser = f.createJsonParser(jsonString);
          return parser.readValueAs(c);
      
      } catch (Exception e) {
          return null;
      }
      

      }
      }

    /**

    • 数组格式JSON串转换为ObjectList对象
    • @param
    • @param jsonString JSON字符串
    • @param tr TypeReference,例如: new TypeReference< List >(){}
    • @return ObjectList对象
      */
      public static T jsonToGenericObject(String jsonString, TypeReference tr){

      if (StringUtils.isEmpty(jsonString)) {
      return null;

      } else {

      // Jackson方式将Json转换为对象
      MappingJsonFactory f = new MappingJsonFactory();
      try {
          JsonParser parser = f.createJsonParser(jsonString);
          return parser.readValueAs(tr);
      
      } catch (Exception e) {
          return null;
      }
      

      }
      }

}[/code]

[quote]
var date={

"userName":"1111",

"password":"2222",

"user.name":"3333",

"user.password":"4444"

};

[/quote]

关键就在这里,只要你的json格式能对的上我给你的那些值即可直接赋值,不用你操心。

先把字符串转化成Map:
[code="java"]
public static Map jsonStr2Map(String jsonStr) {
JSONObject object = JSONObject.fromObject(jsonStr);
Map map = new HashMap();
for (Iterator iter = object.keys(); iter.hasNext();) {
String key = (String) iter.next();
map.put(key, object.get(key));
}
return map;
}
[/code]
根据Key来判断直接给 User赋值,还是一个新的User对象

[quote]
嗯,很感谢,这种方法是可以的,不过我还是想问下,json的深层嵌套对象传入后台是怎么处理的,呃,最近在学json,但是网上这种实例很少,只能问问各位大侠了

[/quote]

会有专门的拦截器来进行转换。

[quote]json的深层嵌套对象传入后台是怎么处理的,[/quote] 就是要把字符串解析成Map,或者List

具体可以看下Json-lib的源码, Json的格式跟XML还是非常的像

[quote]
嗯,很感谢,这种方法是可以的,不过我还是想问下,json的深层嵌套对象传入后台是怎么处理的,呃,最近在学json,但是网上这种实例很少,只能问问各位大侠了

[/quote]
json的深层嵌套传入后台是怎么处理的?这个是你想太多了,你传到struts2就必须遵守struts2定义的规则,他就是那么传递-封装的。你只需要记住就好了,或者你换一个其他的框架,传值的方式又不一样了。我说的意思你是不是明白?

[quote]问题是
JSONObject object = JSONObject.fromObject(jsonStr);
这里的jsonStr是哪里获得的
var date={

"userName":"1111",

"password":"2222",

"user":{

"name":"3333",

"password":"4444"

}

};
post传入的数据格式如下
password 123
userName 1232
userStr [object Object]
action中获取
userStr字符串就是"[object Object]"
执行
JSONObject object = JSONObject.fromObject(userStr);
就会报错 [/quote]
[code="java"]
var date={

"userName":"1111",

"password":"2222",

"user":{

"name":"3333",

"password":"4444"

}

};

[/code]
这个 date 是Js的Object,需要先转化成String(用json.js转化,网上有,我也可以发送给你) 再传给Action, 就不会是 "[object Object]"

深层嵌套,是可以自定义拦截器进行自定义解析。