JSON可以以[?开头吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (26)

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

我使用这个json4j库,并且我得到了一个开始的输入[,所以我不认为这是有效的JSON。我简单地看了一下JSON模式,但我无法真正发现它说JSON文件不能启动[,或者它只能启动{

提问于
用户回答回答于

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

JSON建立在两个结构上:

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

然后它将这两种结构描述为:

请注意,起始和结束字符分别是大括号和方括号。 并从这里:http : //www.ietf.org/rfc/rfc4627.txt

JSON文本是一系列令牌。这组令牌包括六个结构字符,字符串,数字和三个字面名称。 JSON文本是一个序列化的对象或数组。

有一个新的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文本可以以方括号(即数组)开始。但除了对象和数组之外,它现在也可以是数字,字符串或值falsenull或者true

另外,这已经改变了我以前的RFC 4627报价(强调增加):

JSON文本是一系列令牌。这组令牌包括六个结构字符,字符串,数字和三个字面名称。 JSON文本是一个序列化的。请注意,某些先前的JSON规范将JSON文本约束为对象或数组。只生成对象或数组的JSON文本被调用的实现将是可互操作的,因为所有实现都将接受这些JSON文本为符合条件的JSON文本。

用户回答回答于

如果要解析的字符串以左大括号([)开头,可以使用该大括号JSONArray.parse取回JSONArray对象,然后可以使用get(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: ['

扫码关注云+社区