Z tego, co mogę przeczytać na json.org , wszystkie ciągi JSON powinny zaczynać się od {
(nawias klamrowy), a [
znaki (nawiasy kwadratowe) reprezentują element tablicy w formacie JSON.
Korzystam z json4j
biblioteki i otrzymałem dane wejściowe zaczynające się od [
, więc nie sądziłem, że to poprawny JSON. Przejrzałem krótko schemat JSON, ale tak naprawdę nie mogłem znaleźć stwierdzenia, że plik JSON nie może zaczynać się od [
lub może zaczynać się tylko od {
.
Odpowiedzi:
JSON może być tablicą lub obiektem. W szczególności poza json.org:
JSON jest zbudowany na dwóch strukturach:
- Zbiór par nazwa / wartość. W różnych językach jest to realizowane jako obiekt, rekord, struktura, słownik, tabela skrótów, lista z kluczami lub tablica asocjacyjna.
- Uporządkowana lista wartości. W większości języków jest to realizowane jako
tablica, wektor, lista lub sekwencja.
Następnie opisuje dwie struktury jako:
Zwróć uwagę, że znaki początkowe i końcowe to odpowiednio nawiasy klamrowe i nawiasy kwadratowe.
Edytuj
I stąd: http://www.ietf.org/rfc/rfc4627.txt
Tekst JSON to sekwencja tokenów. Zestaw tokenów zawiera sześć znaków strukturalnych, ciągi, liczby i trzy nazwy literałów.
Tekst JSON to serializowany obiekt lub tablica.
Aktualizacja (2014)
Od marca 2014 r. Pojawił się nowy kod JSON RFC ( 7159 ), który nieznacznie modyfikuje definicję (patrz strony 4/5).
Definicja według RFC 4627 była następująca: JSON-text = object / array
Zostało to zmienione w RFC 7159 na: JSON-text = ws value ws
Gdzie ws
reprezentuje białe znaki i value
jest zdefiniowane w następujący sposób:
Wartość JSON MUSI być obiektem, tablicą, liczbą lub ciągiem albo jedną z trzech następujących nazw literałów:
false null true
Tak więc odpowiedź na pytanie nadal brzmi tak, tekst JSON może zaczynać się od nawiasu kwadratowego (tj. Tablicy). Ale oprócz obiektów i tablic, może teraz być również liczba, ciąg znaków lub wartości false
, null
lub true
.
Ponadto zmieniło się to w porównaniu z moim poprzednim cytatem RFC 4627 (podkreślenie dodane):
Tekst JSON to sekwencja tokenów. Zestaw tokenów zawiera sześć znaków strukturalnych, ciągi, liczby i trzy nazwy literałów.
Tekst JSON to zserializowana wartość . Zwróć uwagę, że niektóre wcześniejsze specyfikacje formatu JSON ograniczały tekst JSON do bycia obiektem lub tablicą. Implementacje, które generują tylko obiekty lub tablice, w których wywoływany jest tekst JSON, będą interoperacyjne w tym sensie, że wszystkie implementacje zaakceptują je jako zgodne teksty JSON.
JSON-text = ws value ws
gdzie „Wartość JSON MUSI być obiektem, tablicą, liczbą lub ciągiem znaków, lub jedna z następujących trzech nazw literałów: false, null, true ”zgodnie z sekcją 3 (wartości). Twój przykład nie spełnia tych ograniczeń, więc nie jest prawidłowym formatem JSON.
Odpowiedzi:
Jeśli ciąg, który analizujesz, zaczyna się od lewego nawiasu klamrowego ([), którego możesz użyć JSONArray.parse
do odzyskania obiektu JSONArray, a następnie możesz użyć, get(i)
gdzie i jest indeksem od 0 do zwróconych JSONArray's 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();
}
}
}
Który dał wynik, taki jak:
{"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"}
Uwaga: jeśli spróbujesz zadzwonić JSONObject.parse(books.toString());
, otrzymasz napotkany błąd:
java.io.IOException: Expecting '{' on line 1, column 2 instead, obtained token: 'Token: ['
źródło
STRONA JSON.ORG MÓWI ...
Witryna wyraźnie stwierdza, co następuje:
JSON jest zbudowany na dwóch strukturach:
Zbiór par nazwa / wartość. W różnych językach jest to realizowane jako obiekt, rekord, struktura, słownik, tabela skrótów, lista z kluczami lub tablica asocjacyjna.
Uporządkowana lista wartości. W większości języków jest to realizowane jako tablica, wektor, lista lub sekwencja.
To są uniwersalne struktury danych. Praktycznie wszystkie współczesne języki programowania obsługują je w takiej czy innej formie. Ma sens, aby format danych, który jest wymienny z językami programowania, również był oparty na tych strukturach. W JSON przyjmują następujące formy:
OBIEKT:
Obiekt to nieuporządkowany zestaw par nazwa / wartość. Obiekt zaczyna się od {(lewy nawias klamrowy) i kończy na} (prawy nawias). Po każdej nazwie następuje: (dwukropek), a pary nazwa / wartość są oddzielone (przecinek).
{string: value, string: value}
SZYK:
Tablica to uporządkowany zbiór wartości. Tablica zaczyna się od [(lewy nawias) i kończy na] (prawy nawias). Wartości są oddzielone (przecinek).
[value, value, value ….]
WARTOŚĆ:
Wartość może być łańcuchem w podwójnych cudzysłowach, liczbą, prawdą, fałszem lub null, obiektem lub tablicą. Struktury te mogą być zagnieżdżane.
STRUNOWY:
Łańcuch to sekwencja zera lub więcej znaków Unicode, umieszczona w podwójnych cudzysłowach, przy użyciu odwrotnych ukośników. Znak jest reprezentowany jako pojedynczy ciąg znaków. Ciąg jest bardzo podobny do ciągu w języku C lub Java.
NUMER:
Liczba jest bardzo podobna do liczby w języku C lub Java, z tym wyjątkiem, że nie są używane formaty ósemkowe i szesnastkowe.
O WHITESPACE:
Spacje można wstawić między dowolną parę tokenów. Z wyjątkiem kilku szczegółów dotyczących kodowania, które całkowicie opisują język.
źródło
[]
, przeanalizowanie go jako tablicę i pobranie pierwszego elementu tablicy).