【问题标题】:Odd "JSONObject not found" error奇怪的“未找到 JSONObject”错误
【发布时间】:2014-08-20 15:21:27
【问题描述】:

我遇到了关于从 HTTP 请求正文进行 JSON 转换的问题。 首先,这里是发送请求的 Javascript 代码。

object 变量可以是{"view":"global"},例如。

var sendHttpRequest = function (url, object)
{
    xmlhttp = new XMLHttpRequest();
    xmlhttp.open("POST", url, true);
    xmlhttp.setRequestHeader("Content-type", "application/json; charset=UTF-8");
    var json = JSON.stringify(object);
    xmlhttp.send(json);
};

那么这里是Java部分:

@Override
@RequestMapping(value = "/departments")
public 
@ResponseBody
void getJsonObject(HttpServletRequest request)
{
    StringBuilder jb = new StringBuilder();
    String line = null;
    try {
      BufferedReader reader = request.getReader();
      while ((line = reader.readLine()) != null)
        jb.append(line);

    } catch (Exception e) {}

    JSONObject json = new JSONObject(jb.toString());

    String view = json.getString("view");
    ...
}

最后一行引发了这个错误:

org.json.JSONException: JSONObject["view"] not found.

然而,如果我打印json 变量,我会得到{"view":"global"},这似乎是正确的......

有人知道吗?

非常感谢!

编辑:

“未找到”问题是由于 jb.toString() 直接传递给 JSONObject 构造函数。这是编辑后的代码:

@Override
@RequestMapping(value = "/departments")
public 
@ResponseBody
void getJsonObject(HttpServletRequest request)
{
    StringBuilder jb = new StringBuilder();
    String line = null;
    try {
      BufferedReader reader = request.getReader();
      while ((line = reader.readLine()) != null)
        jb.append(line);

    } catch (Exception e) {}

    String str = jb.toString();
    JSONObject json = new JSONObject(str);

    String view = json.getString("view");
    ...
}

但这一次,错误是:

A JSONObject text must begin with '{' at 1 [character 2 line 1]

适用于 json 硬编码,但不适用于 str 变量。然而,它的打印似乎是正确的,没有空格:

{"view":"global"}

【问题讨论】:

  • 您是否尝试在单元测试或非常小的控制台项目中重现同样的错误,并提供您的 String 作为您的 JSON 对象?
  • 不,我没有,但我多次尝试用一些 json 硬代码替换 jb.toString(): JSONObject json = new JSONObject("{\"view\":\"global\"}" );,但也会出现同样的错误。
  • 你使用的是来自 json.org 的JSONObject,对吧?
  • @LuiggiMendoza 是的,按照执行情况
  • @user3218114 只是想确定...谁知道...

标签: java javascript json httprequest


【解决方案1】:

当我按如下方式运行您的代码时,

public static void main(String[] args) {
    String str = "{\"view\":\"global\"}";
    org.json.JSONObject json = new org.json.JSONObject(str);
    String view = json.getString("view");
    System.out.println(view);
}

我明白了

global

【讨论】:

  • OP 已经尝试过同样的事情,正如 OP 在 cmets 中提到的那样。
  • 感谢 Elliott,问题实际上是由于 jb.toString() 被直接传递到 JSONObject 构造函数!似乎它以前已放入变量中。然而,刚刚引发了另一个错误,“JSONObject 文本必须在 1 [字符 2 第 1 行] 处以 '{' 开头”。这似乎很奇怪,因为 jb.toString() 打印似乎是正确的。我编辑了第一篇文章。
  • 你一定是从请求中提取了一些奇怪的控制字符。尝试修剪字符串。您应该使用为您完成所有这些工作的 Jackson 库。
  • 如果我找不到路,我可以尝试看看杰克逊,但我想尝试更多 ^^ 无论如何我修剪了字符串,但结果相同,似乎没有包含任何前导或尾随空格。
【解决方案2】:

你可以试试TypeReference吗?

示例代码:

TypeReference<Map<String, String>> t=new TypeReference<Map<String, String>>(){};
ObjectMapper mapper = new ObjectMapper();
try {
    Map<String, String> data = mapper.readValue("{\"view\":\"global\"}", t);
    System.out.println(data.get("view")); // prints global
} catch (Exception e) {
    System.out.println("There might be some issue with the JSON string");
}

问题可能与从客户端发送到服务器的编码字符串有关。正确解码后再试。

JSON.stringify() 到底是做什么的?将服务器端的 JSON 字符串打印为 SOP 并尝试调试。

【讨论】:

  • 我现在无法测试,但我会在明天早上尝试并分享结果。谢谢!
猜你喜欢
  • 2015-09-02
  • 2011-04-25
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多