joyworker
懒人的愿望
2011-11-18 09:59
浏览 619
已采纳

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

14条回答 默认 最新

  • li28544071
    li28544071 2011-11-18 10:55
    已采纳

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

    "userName":"1111",

    "password":"2222",

    "user.name":"3333",

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

    点赞 评论
  • qq1988627
    qq1988627 2011-11-18 10:22



    success,id

    点赞 评论
  • qq1988627
    qq1988627 2011-11-18 10:24

    [code="java"]



    success,id


    [/code]

    点赞 评论
  • qq1988627
    qq1988627 2011-11-18 10:25

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

    点赞 评论
  • jiangguangxian
    jiangguangxian 2011-11-18 10:27

    [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的继承很重要

    点赞 评论
  • qq1988627
    qq1988627 2011-11-18 10:35

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

    点赞 评论
  • kendy_2007
    kendy_2007 2011-11-18 10:41

    如果楼主使用的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]

    点赞 评论
  • jiangguangxian
    jiangguangxian 2011-11-18 10:58

    [quote]
    var date={

    "userName":"1111",

    "password":"2222",

    "user.name":"3333",

    "user.password":"4444"

    };

    [/quote]

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

    点赞 评论
  • yanjinke
    yanjinke 2011-11-18 11:08

    先把字符串转化成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对象

    点赞 评论
  • jiangguangxian
    jiangguangxian 2011-11-18 11:17

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

    [/quote]

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

    点赞 评论
  • yanjinke
    yanjinke 2011-11-18 11:21

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

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

    点赞 评论
  • li28544071
    li28544071 2011-11-18 11:24

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

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

    点赞 评论
  • yanjinke
    yanjinke 2011-11-18 11:27

    [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]"

    点赞 评论
  • jiangguangxian
    jiangguangxian 2011-11-18 11:31

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

    点赞 评论

相关推荐