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;
/**
@created 2010-10-19 下午02:50:21
/
public class XMLJsonUtils {
/*
@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();
}
/**
/**
}
/**
@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;
}
}
}
/**
@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]"
深层嵌套,是可以自定义拦截器进行自定义解析。