从我在json.org上读到的,所有JSON字符串都应该以{(花括号)开始,[字符(方括号)表示JSON中的数组元素。

我使用json4j库,我得到了一个以[开始的输入,所以我不认为这是有效的JSON。我简单地看了一下JSON模式,但我没有发现JSON文件不能以[或只能以{开头。


当前回答

简单的回答是肯定的

在.json文件中,你可以放入数字(甚至只是10),字符串(甚至只是“hello”),布尔值(真,假),Null(甚至只是Null),数组和对象。 https://www.json.org/json-en.html

只使用数字、字符串、布尔值和空值是不符合逻辑的,因为在.jon文件中,我们使用更复杂的结构化数据,如数组和对象(大多数混合嵌套版本)。

下面你可以找到一个JSON数据样本,数组为object,以“[”开头 https://jsonplaceholder.typicode.com/posts

其他回答

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文本。

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文件中,你可以放入数字(甚至只是10),字符串(甚至只是“hello”),布尔值(真,假),Null(甚至只是Null),数组和对象。 https://www.json.org/json-en.html

只使用数字、字符串、布尔值和空值是不符合逻辑的,因为在.jon文件中,我们使用更复杂的结构化数据,如数组和对象(大多数混合嵌套版本)。

下面你可以找到一个JSON数据样本,数组为object,以“[”开头 https://jsonplaceholder.typicode.com/posts

如果要解析的字符串以左大括号([)开头,则可以使用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: ['