我可以在json.org上看到,所有JSON字符串都应以{
(大括号)开头,而[
字符(方括号)表示JSON中的数组元素。 / p>
我使用json4j
库,我得到一个以[
开头的输入,所以我认为这不是有效的JSON。我简要地看了一下JSON模式,但我真的发现它没有说明JSON文件不能以[
开头,或者它只能以{
开头。
答案 0 :(得分:173)
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
ws
代表空格,value
定义如下:
JSON值必须是对象,数组,数字或字符串,或者是其中之一 以下三个字面名称:
false null true
因此,问题的答案仍然是肯定的,JSON文本可以以方括号(即数组)开头。但除了对象和数组之外,它现在也可以是数字,字符串或值false
,null
或true
。
此外,这已经改变了我之前的RFC 4627引用(强调添加):
JSON文本是一系列令牌。这组令牌包括六个 结构字符,字符串,数字和三个文字名称。
JSON文本是序列化的值。注意某些先前的 JSON的规范将JSON文本约束为对象或 阵列。仅生成对象或数组的实现 调用的JSON文本在所有方面都是可互操作的 实现将接受这些作为符合JSON文本。
答案 1 :(得分:5)
如果要解析的字符串以左括号([)开头,则可以使用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();
}
}
}
产生的输出如下:
{"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"}
注意:如果您尝试拨打JSONObject.parse(books.toString());
,则会收到您遇到的错误:
java.io.IOException: Expecting '{' on line 1, column 2 instead, obtained token: 'Token: ['
答案 2 :(得分:1)
JSON.ORG网站说....
该网站明确声明以下内容:
JSON建立在两个结构上:
名称/值对的集合。用各种语言,这是 实现为对象,记录,结构,字典,哈希表,键控 列表或关联数组。
值的有序列表。在大多数语言中,这实现为 数组,向量,列表或序列。
这些是通用数据结构。几乎所有现代编程语言都以一种或另一种形式支持它们。可以与编程语言互换的数据格式也应基于这些结构,这是有道理的。 在JSON中,它们采用以下形式:
对象:
对象是一组无序的名称/值对。一个对象以{(左括号)开始,以}(右括号)结尾。每个名称后都跟有:(冒号),名称/值对之间以逗号分隔。
{string: value, string: value}
阵列:
数组是值的有序集合。数组以[[(左括号)开始,以]](右括号)结尾。值之间以逗号分隔。
[value, value, value ….]
VALUE:
值可以是双引号中的字符串,也可以是数字,真或假或空值或对象或数组。这些结构可以嵌套。
STRING:
字符串是由零个或多个Unicode字符组成的序列,使用反斜杠转义符将其括在双引号中。字符表示为单个字符串。字符串非常类似于C或Java字符串。
NUMBER:
数字非常类似于C或Java数字,只是不使用八进制和十六进制格式。
关于白空间:
可以在任意一对标记之间插入空格。除了一些编码细节之外,它完全描述了该语言。