Java servlet的请求参数的名称设置为整个json对象

时间:2012-10-19 16:57:56

标签: javascript ajax json jsp

我通过ajax将json对象发送到java servlet。 json对象是键值类型,其中三个键指向数组,一个键指向单个字符串。我用这样的javascript构建它:

var jsonObject = {"arrayOne": arrayOne, "arrayTwo": arrayTwo, "arrayThree": arrThree, "string": stringVar};

然后我使用ajax将它发送到java servlet,如下所示:

httpRequest.open('POST', url, true);  
httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");  
httpRequest.setRequestHeader("Connection", "close");  
var jsonString = jsonObject.toJSONString();   
httpRequest.send(jsonString);

这会将字符串发送到我的servlet,但它没有像我期望的那样显示。整个json字符串设置为我的请求参数之一的名称。所以在我的servlet中,如果我做request.getParameterNames();它将返回一个枚举,其中一个表条目的键是整个对象的内容。我可能弄错了,但我的想法是它应该将每个键设置为不同的参数名称。所以我应该有4个参数,arrayOne,arrayTwo,arrayThree和string。我做错了什么还是我的想法?任何帮助表示赞赏。

由于

2 个答案:

答案 0 :(得分:1)

当您将内容类型设置为application/x-www-form-urlencoded时,您告诉服务器请求内容将是"param1=value1&param2=value2..."形式的字符串。但是你的实际内容只是一个单一的价值; x-www-form-urlencoded内容类型与JSON无关。如果要将请求作为JSON传递,则需要将内容类型设置为application/json,然后在服务器端使用JSON解析器来解析它并提取键/值对。 / p>

或者,您可以保留x-www-form-urlencoded type,遍历您的JSON对象,并为每个键/值对,将值序列化为JSON字符串和URL编码,并使用它来构建请求字符串看起来像是:

arrayOne=<arrayOne JSON string>&arrayTwo=<arrayTwo JSON String>&...

答案 1 :(得分:1)

这是预期的行为,您将对象转换为字符串(使用toJSONString),并将其作为请求参数发送。您可能希望使用Jackson,Jettison或XStream等库在服务器端解析JSON值,请参阅http://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/