【问题标题】:Jsonexception: text must begin with '{'Jsonexception:文本必须以'{'开头
【发布时间】:2015-08-26 09:49:18
【问题描述】:

大家好,我正在将 json 对象从 javascript 发送到 servlet,但我遇到了异常

看看我的javascript

<script>
  var xmlhttp = new XMLHttpRequest();
   var line = {
      lines: []
    };
    function changeColor( newColor,num) {
       line.lines.push({"linechange":num});
      var elem = document.getElementById(newColor);
      elem.style.background = "pink";

  xmlhttp.open("POST", "/SaveHighlights?p=" + line , true);
    }

看看我的servlet代码

JSONObject jobj1 = new JSONObject(request.getParameter("p"));
Iterator it = jobj1.keys();

        while(it.hasNext())
        {
            String key = (String) it.next();
            int o = (int) jobj1.get(key);
            Syatem.out.println(key + o);
        }

这是我要发送的示例 json 对象

line = lines[{"linechange":2,
             "linechange":7,
              ......}];

谁能建议我解决这个问题

堆栈跟踪

org.json.JSONException: A JSONObject text must begin with '{' at 1 [character 2 line 1]
at org.json.JSONTokener.syntaxError(JSONTokener.java:433)
at org.json.JSONObject.<init>(JSONObject.java:188)
at org.json.JSONObject.<init>(JSONObject.java:314)
at SaveHighlights.doPost(SaveHighlights.java:25)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2516)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2505)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

【问题讨论】:

  • request.getParameter("p")返回的内容究竟是什么?
  • 如果您的“JSON”以“line = lines[{ ...”开头,那么它不是 JSON!错误消息告诉你的是什么......
  • 发布您的堆栈跟踪
  • "p" 保存变量行
  • @SumanthUdupa:我问你那个变量的内容

标签: javascript json servlets


【解决方案1】:
"/SaveHighlights?p=" + line

会导致

"/SaveHighlights?p=[object Object]"

因为将对象强制为字符串会这样做

你想要(也许)

"/SaveHighlights?p=" + JSON.stringify(line)

编辑:

基于Java代码,你可能实际上想要

"/SaveHighlights?p=" + JSON.stringify(line.lines)

json 对象

没有这样的动物...... JSON 是一种纯粹的字符串数据交换格式

正如 cmets 中所讨论的,您正在使用查询字符串执行 POST,虽然这样做可能有一些(半有效的)原因,要么执行 GET,要么像这样执行 POST:

  function changeColor(newColor, num) {
      line.lines.push({
          "linechange": num
      });
      var elem = document.getElementById(newColor);
      elem.style.background = "pink";
      var params = 'p=' + JSON.stringify(line);
      xmlhttp.open("POST", "/SaveHighlights", true);
      http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      http.setRequestHeader("Content-length", params.length);
      http.send(params);
  }

您可能需要对服务器端进行更改,因为您不再在查询字符串中传递数据,我对您的服务器端了解不多,无法提供帮助

您将在服务器上的参数 p 中获得的字符串可能类似于

{
    "lines": [
      {"linechange": 3}, 
      {"linechange": 7}, 
      {"linechange": 5}
    ]
}

所以,我认为你的代码会尝试“解析”

    [
      {"linechange": 3}, 
      {"linechange": 7}, 
      {"linechange": 5}
    ]

作为一个整数...不是 100% 肯定,因为我的 java 充其量是生锈的

【讨论】:

  • 建议不要使用带有 POST 的查询字符串。
  • 当我看到这个答案时我才意识到。
  • @JaromandaX 我按照您的说明进行了尝试,但现在我遇到了错误。 Java.lang.ClassCastException:org.json.JSONArray 无法转换为 java.lang.Integer
  • 是的,您需要准确显示您发送的数据是什么...您问题中的 sn-p 不太可能与您得到的完全相同...越准确您可以提供的信息,人们就越容易提供帮助......
  • 我通过将整数值放入键“linechange”来发送整数值。在服务器端之后,我正在检索我的整数值。
【解决方案2】:

我认为,你不应该使用 JSONObject。您必须使用 JSONArray,因为这是您在代码中尝试执行的操作。

JSONArray jsonArray = new JSONArray(response.getEntity(String.class));
        for(int i =0; i< jsonArray.length(); i++){
            if(jsonArray.get(i) instanceof JSONObject){
                JSONObject jsnObj = (JSONObject)jsonArray.get(i);
                String finalValue = (String)jsnObj.get("id");
            }
        }

JSON 对象遵循以下结构:

{
 "array": [
{
    key: "value",
    key: "value"
},
{
    key: "value",
    key: "value"
}

]
}

JSON 数组遵循以下结构:

[
 { "key":"value" , "key":"value" }, 
 { "key":"value" , "key":"value" }, 
 { "key":"value" , "key": "value" }
]

【讨论】:

    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多