【问题标题】:Java servlet's request parameter's name set to entire json objectJava servlet 的请求参数名称设置为整个 json 对象
【发布时间】:2012-10-19 16:57:56
【问题描述】:

我通过 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 和字符串。我做错了什么还是我的想法在这里?任何帮助表示赞赏。

谢谢

【问题讨论】:

  • 你会用jQuery吗?它的.ajax 和相关方法为您处理所有编码。
  • 我可以使用 jquery,所以我会检查一下。不过,我可能只会进行服务器端解析。谢谢。

标签: javascript ajax json jsp


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 1970-01-01
      • 2011-08-20
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多