从我在json.org上读到的,所有JSON字符串都应该以{(花括号)开始,[字符(方括号)表示JSON中的数组元素。
我使用json4j库,我得到了一个以[开始的输入,所以我不认为这是有效的JSON。我简单地看了一下JSON模式,但我没有发现JSON文件不能以[或只能以{开头。
从我在json.org上读到的,所有JSON字符串都应该以{(花括号)开始,[字符(方括号)表示JSON中的数组元素。
我使用json4j库,我得到了一个以[开始的输入,所以我不认为这是有效的JSON。我简单地看了一下JSON模式,但我没有发现JSON文件不能以[或只能以{开头。
当前回答
JSON。Org网站说....
https://www.json.org/
该网站明确声明如下:
JSON构建在两个结构上:
名称/值对的集合。在各种语言中,这是 实现为对象、记录、结构、字典、哈希表、键 列表,或者关联数组。 一个有序的值列表。在大多数语言中,这被实现为 数组、向量、列表或序列
这些是通用的数据结构。实际上,所有现代编程语言都以某种形式支持它们。可以与编程语言互换的数据格式也应该基于这些结构,这是有意义的。 在JSON中,它们采用以下形式:
对象:
对象是名称/值对的无序集合。对象以{(左大括号)开始,以}(右大括号)结束。每个名称后跟:(冒号),名称/值对用,(逗号)分隔。
{string: value, string: value}
数组:
数组是值的有序集合。数组以[(左括号)开始,以](右括号)结束。值之间用,(逗号)分隔。
[value, value, value ….]
值:
值可以是双引号中的字符串、数字、true、false或null、对象或数组。这些结构可以嵌套。
字符串:
字符串是由0个或多个Unicode字符组成的序列,用双引号括起来,使用反斜杠转义。字符表示为单个字符串。字符串非常类似于C或Java字符串。
数量:
数字与C或Java数字非常相似,只是不使用八进制和十六进制格式。
空格:
可以在任意一对令牌之间插入空白。除了一些编码细节外,这完全描述了语言。
其他回答
JSON可以是数组,也可以是对象。特别是在json.org之外:
JSON构建在两个结构上: 名称/值对的集合。在各种语言中,这是 实现为一个对象,记录, 结构,字典,哈希表, 键控列表,或者关联数组。 一个有序的值列表。在大多数语言中,这被实现为 数组、向量、列表或序列。
然后将这两种结构描述为:
注意,开始字符和结束字符分别是花括号和方括号。
编辑 从这里:http://www.ietf.org/rfc/rfc4627.txt
JSON文本是一个令牌序列。 令牌集包括6个 结构字符,字符串, 数字和三个字面名称。 JSON文本是一个序列化的对象或数组。
更新(2014)
2014年3月,有一个新的JSON RFC(7159)稍微修改了定义(见第4/5页)。
根据RFC 4627的定义是:JSON-text =对象/数组
在RFC 7159中已更改为:JSON-text = ws value ws
其中ws表示空格,value定义如下:
JSON值必须是对象、数组、数字、字符串或其中之一 以下三个字面名称: False null true
所以,这个问题的答案仍然是肯定的,JSON文本可以以方括号(即数组)开始。但除了对象和数组之外,它现在还可以是数字、字符串或值false、null或true。
此外,这与我之前的RFC 4627报价(强调添加)有所不同:
JSON文本是一个令牌序列。令牌集包括6个 结构字符、字符串、数字和三个字面名称。 JSON文本是一个序列化的值。请注意,以前的某些 JSON规范将JSON文本约束为对象或对象 数组中。只生成对象或数组的实现 JSON文本调用将是互操作的意义上,所有 实现将接受这些作为符合JSON文本。
如果要解析的字符串以左大括号([)开头,则可以使用JSONArray。解析得到一个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: ['
简单的回答是肯定的
在.json文件中,你可以放入数字(甚至只是10),字符串(甚至只是“hello”),布尔值(真,假),Null(甚至只是Null),数组和对象。 https://www.json.org/json-en.html
只使用数字、字符串、布尔值和空值是不符合逻辑的,因为在.jon文件中,我们使用更复杂的结构化数据,如数组和对象(大多数混合嵌套版本)。
下面你可以找到一个JSON数据样本,数组为object,以“[”开头 https://jsonplaceholder.typicode.com/posts
JSON。Org网站说....
https://www.json.org/
该网站明确声明如下:
JSON构建在两个结构上:
名称/值对的集合。在各种语言中,这是 实现为对象、记录、结构、字典、哈希表、键 列表,或者关联数组。 一个有序的值列表。在大多数语言中,这被实现为 数组、向量、列表或序列
这些是通用的数据结构。实际上,所有现代编程语言都以某种形式支持它们。可以与编程语言互换的数据格式也应该基于这些结构,这是有意义的。 在JSON中,它们采用以下形式:
对象:
对象是名称/值对的无序集合。对象以{(左大括号)开始,以}(右大括号)结束。每个名称后跟:(冒号),名称/值对用,(逗号)分隔。
{string: value, string: value}
数组:
数组是值的有序集合。数组以[(左括号)开始,以](右括号)结束。值之间用,(逗号)分隔。
[value, value, value ….]
值:
值可以是双引号中的字符串、数字、true、false或null、对象或数组。这些结构可以嵌套。
字符串:
字符串是由0个或多个Unicode字符组成的序列,用双引号括起来,使用反斜杠转义。字符表示为单个字符串。字符串非常类似于C或Java字符串。
数量:
数字与C或Java数字非常相似,只是不使用八进制和十六进制格式。
空格:
可以在任意一对令牌之间插入空白。除了一些编码细节外,这完全描述了语言。