从我在json.org上可以看到的,所有JSON字符串应该以{(大括号)开头,而[字符(方括号)表示JSON中的数组元素.
我使用该json4j库,我得到了一个开头的输入[,所以我不认为这是有效的JSON.我简要地看了一下JSON模式,但是我真的发现它没有说明JSON文件不能启动[,或者只能从它开始{.
Ric*_*kir 192
JSON可以是数组或对象.特别是json.org:
JSON基于两种结构:
- 名称/值对的集合.在各种语言中,这被实现为对象,记录,结构,字典,散列表,键控列表或关联数组.
- 有序的值列表.在大多数语言中,这被实现为
数组,向量,列表或序列.
然后它继续将两种结构描述为:

请注意,起始和结束字符分别是大括号和方括号.
编辑
并从这里:http://www.ietf.org/rfc/rfc4627.txt
JSON文本是一系列标记.标记集包括六个结构字符,字符串,数字和三个文字名称.
JSON文本是序列化对象或数组.
截至2014年3月,有一个新的JSON RFC(7159)略微修改了定义(参见第4/5页).
RFC 4627的定义是: JSON-text = object / array
这已在RFC 7159中更改为: JSON-text = ws value ws
where ws表示空格,value定义如下:
JSON值必须是对象,数组,数字或字符串,或以下三个文字名称之一:
Run Code Online (Sandbox Code Playgroud)false null true
所以,问题的答案仍然是肯定的,JSON文本可以以方括号(即数组)开头.但除了对象和数组之外,它现在也可以是数字,字符串或值false,null或者true.
此外,这已经改变了我以前的RFC 4627引用(强调添加):
JSON文本是一系列标记.标记集包括六个结构字符,字符串,数字和三个文字名称.
JSON文本是序列化值.请注意,某些先前的JSON规范将JSON文本约束为对象或数组.只生成调用JSON文本的对象或数组的实现将是可互操作的,因为所有实现都将接受这些作为符合JSON文本.
小智 8
JSON.ORG 网站说....
该网站明确声明如下:
JSON 建立在两种结构上:
名称/值对的集合。在各种语言中,这被实现为对象、记录、结构、字典、哈希表、键控列表或关联数组。
值的有序列表。在大多数语言中,这被实现为数组、向量、列表或序列。
这些是通用数据结构。几乎所有现代编程语言都以一种或另一种形式支持它们。可与编程语言互换的数据格式也基于这些结构是有道理的。在 JSON 中,它们采用以下形式:
目的:
对象是一组无序的名称/值对。一个对象以{(左大括号)开始,以}(右大括号)结束。每个名称后跟 :(冒号),名称/值对由 ,(逗号)分隔。
{string: value, string: value}
Run Code Online (Sandbox Code Playgroud)
大批:
数组是值的有序集合。数组以 [(左括号)开始,以 ](右括号)结束。值由 ,(逗号)分隔。
[value, value, value ….]
Run Code Online (Sandbox Code Playgroud)
价值:
值可以是双引号中的字符串、数字、真假或空值、对象或数组。这些结构可以嵌套。
细绳:
字符串是零个或多个 Unicode 字符的序列,用双引号括起来,使用反斜杠转义。一个字符表示为单个字符串。字符串非常类似于 C 或 Java 字符串。
数字:
数字与 C 或 Java 数字非常相似,只是不使用八进制和十六进制格式。
关于空格:
可以在任何一对标记之间插入空格。除了一些编码细节,这完全描述了语言。
如果您正在解析的字符串以左大括号([)开头,您可以使用它JSONArray.parse来获取JSONArray对象,然后您可以使用get(i)其中i是从0到返回的JSONArray的索引size()-1.
import java.io.IOException;
import com.ibm.json.java.JSONArray;
import com.ibm.json.java.JSONObject;
public class BookListTest {
public static void main(String[] args) {
String jsonBookList = "{\"book_list\":{\"book\":[{\"title\":\"title 1\"},{\"title\":\"title 2\"}]}}";
Object book_list;
try {
book_list = JSONObject.parse(jsonBookList);
System.out.println(book_list);
Object bookList = JSONObject.parse(book_list.toString()).get("book_list");
System.out.println(bookList);
Object books = JSONObject.parse(bookList.toString()).get("book");
System.out.println(books);
JSONArray bookArray = JSONArray.parse(books.toString());
for (Object book : bookArray) {
System.out.println(book);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
产生的输出如下:
{"book_list":{"book":[{"title":"title 1"},{"title":"title 2"}]}}
{"book":[{"title":"title 1"},{"title":"title 2"}]}
[{"title":"title 1"}, {"title":"title 2"}]
{"title":"title 1"}
{"title":"title 2"}
Run Code Online (Sandbox Code Playgroud)
注意:如果您尝试拨打电话JSONObject.parse(books.toString());,则会收到您遇到的错误:
java.io.IOException: Expecting '{' on line 1, column 2 instead, obtained token: 'Token: ['
Run Code Online (Sandbox Code Playgroud)