JSON对象的文本必须以“{”开头。

14

我有这个 JSONObject:

{
  "gutter_url" : "",
  "sort_order" : "popularity",
  "result" : [
    {
      "afs" : "Y",
      "release_year" : 1979,
      "album_sort" : "Wall, The"
    }
  ]
}

我想在位置"result"获取数组,因此我编写了以下代码:

JSONObject allCDs = new JSONObject(objectString);
JSONArray CD_List = allCDs.getJSONArray("result");

但是我遇到了这个异常:

Exception in thread "main" org.json.JSONException: A JSONObject text must begin with '{' at character 1
 at org.json.JSONTokener.syntaxError(JSONTokener.java:410)
 at org.json.JSONObject.<init>(JSONObject.java:179)
 at org.json.JSONObject.<init>(JSONObject.java:402)
 at de.htwberlin.gim.Aufgabe8_5.getCoversFor(Aufgabe8_5.java:55)
 at de.htwberlin.gim.Aufgabe8_5.main(Aufgabe8_5.java:77)

你的代码中的objectString是什么? - Java Man
4个回答

16

你可能在将字符串传递给JSONObject时带有前导空格。尝试修剪(trim)一下。

JSONObject allCDs = new JSONObject(objectString.replace(/^\s+/,""));

编辑:我本以为这是 JavaScript。尝试使用 Java 代码进行修剪。

JSONObject allCDs = new JSONObject(objectString.trim());

如果仍然不起作用,那么请显示字符串的第一个字符:

System.out.println((int)objectString.trim().charAt(0));
你应该期望看到123,花括号。事实上,检查整个内容。
System.out.println((int)objectString);  // or
System.out.println((int)objectString.trim());

你也可以尝试从字符串中剪切掉左括号 { 前面的所有内容。

JSONObject allCDs = new JSONObject(objectString.substring(objectString.indexOf('{')));

1
你是对的,但实际上这个逗号错误只是因为我在stackoverflow问题中缩短了JSONObject。原始代码完全正确并已经过检查。 - wong
1
JSONObject(objectString.replace(/^\s+/,""));不起作用:((.replace仅适用于字符 - wong
1
@wong - 很高兴能帮助你。我看到你是 StackOverflow 的新手,欢迎加入!如果方便的话,请给答案点赞并接受它(点击答案旁边的勾号)。谢谢! - RichardTheKiwi
这个objectString.trim()解决了我的问题;)! - wouterds
@RichardTheKiwi 我遇到了同样的问题,这一行 JSONObject allCDs = new JSONObject(objectString.substring(objectString.indexOf('{'))); 解决了问题,但它只获取了json的第一个元素而不是所有元素。如何获取所有的json数据? - Eman87
显示剩余8条评论

1

找到解决方案了!我在阅读Java中的Bulk API时遇到了这个错误,所以如果你也处于同样的情况,请添加以下几行。

con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");

0

这一行末尾有两个逗号:

"sort_order" : "popularity",,

这句话应该只有一个逗号:

"sort_order" : "popularity",

3
你说得对,但实际上这个逗号错误只是因为我在stackoverflow上缩短了JSONObject的内容。原始内容完全正确并已经经过检查。 - wong

0

示例1:从文件中读取Json文本。

package com.json.example;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import org.apache.commons.io.IOUtils;
import org.json.JSONObject;

public class GetArrayObjectFromJsonText {
    public static void main(String[] args) {
        String jsonText;
        try {
            jsonText = IOUtils.toString(new FileInputStream(new File("C:\\Users\\udaykiranp\\Downloads\\Json.txt")));
            int i = jsonText.indexOf("{");
            jsonText = jsonText.substring(i);
            JSONObject jsonFile = new JSONObject(jsonText);
            System.out.println("Input JSON data: "+ jsonFile.toString());
            Object result = jsonFile.get("result");
            System.out.println("Result array Data: "+ result);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

例子2:

String jsonText = "\"{\"gutter_url\":\"\", \"result\":[{\"album_sort\":\"Wall, The\",\"release_year\":1979,\"afs\":\"Y\"}],\"sort_order\":\"popularity\"}\"";
int i = jsonText.indexOf("{");
jsonText = jsonText.substring(i);
JSONObject jsonFile = new JSONObject(jsonText);
System.out.println("Input JSON data: "+ jsonFile.toString());
Object result = jsonFile.get("result");
System.out.println("Result array Data: "+ result);

首先获取{的索引位置,然后读取json文本数据。

输出:

Input JSON data: {"gutter_url":"","result":[{"album_sort":"Wall, The","release_year":1979,"afs":"Y"}],"sort_order":"popularity"}
Result array Data: [{"album_sort":"Wall, The","release_year":1979,"afs":"Y"}]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接