【问题标题】:JSONException: A JSONObject text must begin with '{' at characterJSONException:JSONObject 文本必须以字符“{”开头
【发布时间】:2016-12-28 10:25:02
【问题描述】:

我有一个如下的 JSON 对象。当我尝试使用以下方法获取名称的值时:

String name = jsonObject.getJSONObject("result").getString("name");

在java中

{ 
    "result":
    {
        "name":   "ABC",
        "dob": "12-11-1958",
        "issue_date": "01-11-2011",
        "blood_group": "",
        "father/husband": "BCD",
        "address": "53/9 ASHOK NAGAR,Delhi 110018",
        "cov_details": {
            "LMV": "01-11-2011  DY.DIR.ZONAL OFFICE,NORTH WEST DISTRICT-II,ROHINI",
            "MCWG": "01-11-2011  DY.DIR.ZONAL OFFICE,NORTH WEST DISTRICT-II,ROHINI"
        },
        "validity": {
            "non-transport": "01-11-1958 to 31-10-1978",
            "transport": ""
        } 
    } 
}

它给了我:

org.json.JSONException: JSONObject 文本必须以 '{' 开头的字符 6 异常。

【问题讨论】:

  • 你需要调试这个。首先检查“jsonObject”中的内容,如果正确,则检查 jsonObject.getJSONObject(“result”),如果这也符合预期,则检查 jsonObject.getJSONObject(“result”).getString(“name”)。我希望这会有所帮助。
  • @charu 实际上你是对的,问题是在调试时我知道它正在向我发送内部服务器错误,这实际上不会发生在 REST POSTMAN 客户端中的相同请求的情况下.
  • 此外,当我发出这个请求时,okhttp3.RequestBody body = okhttp3.RequestBody.create(mediaType, "{\"a_no\":\"123445566\",\"dob\":\ "30-11-1992\",\"键\":\"abcd123\"}");它工作正常,现在我要做的是传递引用变量而不是静态字符串,我该怎么做。
  • 整理了代码和一些语法。

标签: java json spring-mvc


【解决方案1】:

我相信您没有加载正确的内容。这是一个使用您发布的输入的小程序:

package org.json;

import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    StringBuilder sb = new StringBuilder();
    for (Scanner sc = new Scanner(Main.class.getResourceAsStream("in.json")); sc.hasNext(); ) {
      sb.append(sc.nextLine()).append("\n");
    }

    JSONObject jsonObject = new JSONObject(sb.toString());
    String name = jsonObject.getJSONObject("result").getString("name");
    System.out.println("name=" + name); 
    System.out.println("jsonObject=" + jsonObject); 
  }
}

输出如预期:

name=ABC
jsonObject={"result":{"cov_details":{"MCWG":"01-11-2011  DY.DIR.ZONAL OFFICE,NORTH WEST DISTRICT-II,ROHINI","LMV":"01-11-2011  DY.DIR.ZONAL OFFICE,NORTH WEST DISTRICT-II,ROHINI"},"address":"53/9 ASHOK NAGAR,Delhi 110018","issue_date":"01-11-2011","dob":"12-11-1958","name":"ABC","blood_group":"","validity":{"transport":"","non-transport":"01-11-1958 to 31-10-1978"},"father/husband":"BCD"}}

因此,我认为您在加载/初始化jsonObject 变量指向的对象时遇到问题。

FTR,我正在使用来自https://github.com/stleary/JSON-java 的 JSON 库。

【讨论】:

  • okhttp3.OkHttpClient client = new okhttp3.OkHttpClient(); public static void main(String[] args) {okhttp3.OkHttpClient client = new okhttp3.OkHttpClient(); MediaType mediaType = MediaType.parse("application/json"); okhttp3.RequestBody body = okhttp3.RequestBody.create(mediaType, "{\"a_no\":\"10830\",\"dob\":\"30-11-1992\",\"key\":\ "abc\"}"); okhttp3.Request request = new okhttp3.Request.Builder().url("api.abc.com:8087/test") .post(body).build(); okhttp3.Response response = client.newCall(request).execute(); JSONObject jsonObject =新 JSONObject(response.body().string());
  • 这是我正在使用的程序,它为我提供了正确的值,而在使用引用变量构建值时它会抛出错误。
  • @Mavericks 可以打印jsonObject 的值,即:System.out.println(jsonObject) 吗?这将使您更容易理解您的问题
  • @Mavericks,你能打印出response.body 的值吗?换句话说,您需要运行您的程序,但将最后几行更改为:okhttp3.Response response = client.newCall(request).execute(); System.out.println(response.body().string());
  • 非常感谢它在初始化 JSONObject 并传递 JSONObject obj = new JSONObject(response.body().string());
【解决方案2】:

@Mavericks 你在使用 retorfit 发帖吗?如果是,则使用 compile 'com.squareup.retrofit2:converter-scalars:2.1.0' 发布纯文本。

【讨论】:

  • 不完全是我在使用 com.squareup.okhttp3 3.4 版
  • 我认为您在提出请求时遇到了斜线问题,请参考此链接stackoverflow.com/questions/21568681/…
  • 感谢您的回复,但情况并非如此,如上面示例 JSON 数据中所述,它们在我的 JSON 中没有任何斜线。
  • 打印您的参考变量,它将出现在您创建 JSON 时添加额外斜杠的编辑器问题
猜你喜欢
  • 2018-03-13
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多