JSON可以以“[”开头吗?

时间:2011-02-17 20:46:42

标签: json

我可以在json.org上看到,所有JSON字符串都应以{(大括号)开头,而[字符(方括号)表示JSON中的数组元素。 / p>

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

3 个答案:

答案 0 :(得分:173)

JSON可以是数组或对象。特别是json.org:

  

JSON基于两种结构:

     
      
  • 名称/值对的集合。在各种语言中,这是   实现为对象,记录,   结构,字典,哈希表,   键控列表或关联数组。
  •   
  • 有序的值列表。在大多数语言中,这被实现为   数组,向量,列表或序列。
  •   

然后继续将这两种结构描述为: A JSON object A JSON array

请注意,起始和结束字符分别是大括号和方括号。

修改
从这里开始:http://www.ietf.org/rfc/rfc4627.txt

  

JSON文本是一系列令牌。   这组令牌包括六个   结构特征,字符串,   数字和三个字面名称。

     

JSON文本是序列化对象或数组。

更新(2014)

截至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文本可以以方括号(即数组)开头。但除了对象和数组之外,它现在也可以是数字,字符串或值falsenulltrue

此外,这已经改变了我之前的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网站说....

https://www.json.org/

该网站明确声明以下内容:

JSON建立在两个结构上:

  1. 名称/值对的集合。用各种语言,这是 实现为对象,记录,结构,字典,哈希表,键控 列表或关联数组。

  2. 值的有序列表。在大多数语言中,这实现为 数组,向量,列表或序列。

这些是通用数据结构。几乎所有现代编程语言都以一种或另一种形式支持它们。可以与编程语言互换的数据格式也应基于这些结构,这是有道理的。 在JSON中,它们采用以下形式:

对象:

对象是一组无序的名称/值对。一个对象以{(左括号)开始,以}(右括号)结尾。每个名称后都跟有:(冒号),名称/值对之间以逗号分隔。

{string: value, string: value}

阵列:

数组是值的有序集合。数组以[[(左括号)开始,以]](右括号)结尾。值之间以逗号分隔。

[value, value, value ….]

VALUE:

值可以是双引号中的字符串,也可以是数字,真或假或空值或对象或数组。这些结构可以嵌套。

STRING:

字符串是由零个或多个Unicode字符组成的序列,使用反斜杠转义符将其括在双引号中。字符表示为单个字符串。字符串非常类似于C或Java字符串。

NUMBER:

数字非常类似于C或Java数字,只是不使用八进制和十六进制格式。

关于白空间:

可以在任意一对标记之间插入空格。除了一些编码细节之外,它完全描述了该语言。