JsonReader 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。
[Android.Runtime.Register("android/util/JsonReader", DoNotGenerateAcw=true)]
public sealed class JsonReader : Java.Lang.Object, IDisposable, Java.IO.ICloseable
[<Android.Runtime.Register("android/util/JsonReader", DoNotGenerateAcw=true)>]
type JsonReader = class
inherit Object
interface ICloseable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- 繼承
- 屬性
- 實作
備註
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 此串流包含字面值(字串、數字、布林值與空值)以及物件與陣列的開始與結束分隔符。 這些權杖是以深度優先順序遍歷,與 JSON 文件中出現的順序相同。 在 JSON 物件中,名稱/值對由單一標記表示。
<h3>解析 JSON/<h3> 要為自己的 JSON 串流建立遞迴下降解析器,首先建立一個入口點方法來建立一個 JsonReader。
接著,為 JSON 文字中的每個結構建立處理方法。 你需要為每個物件類型和每個陣列類型都設定一個方法。
<ul><li>在強陣<列處理>/強<方法中>,第一次呼叫#beginArray消耗陣列開括號。 接著建立一個 while 迴圈來累積值,當 為假時 #hasNext 終止。 最後,透過呼叫 #endArray來讀取陣列的閉括號。
<在>強物件處理</強>方法中<,第一次呼叫>消耗物件的開#beginObject頭括號。 接著建立一個 while 迴圈,根據變數名稱指派值給本地變數。 當 #hasNext 為假時,這個迴圈應該會終止。 最後,透過呼叫 #endObject來讀取物件的閉合括號。
</ul>
當遇到巢狀物件或陣列時,將任務委派給對應的處理程序方法。
當遇到未知名稱時,嚴格解析器應會失敗,但有例外。 寬容解析器應呼叫 #skipValue() 遞迴跳過該值的巢狀標記,否則這些標記可能會相互衝突。
如果某個值可能是空值,你應該先用 #peek()來檢查。 空值值可用 #nextNull() 或 #skipValue()。
<h3>範例</h3> 假設我們想要解析一串訊息,例如以下:
{@code
[
{
"id": 912345678901,
"text": "How do I read JSON on Android?",
"geo": null,
"user": {
"name": "android_newb",
"followers_count": 41
}
},
{
"id": 912345678902,
"text": "@android_newb just use android.util.JsonReader!",
"geo": [50.454722, -104.606667],
"user": {
"name": "jesse",
"followers_count": 2
}
}
]}
此程式碼實作上述結構的解析器:
{@code
public List<Message> readJsonStream(InputStream in) throws IOException {
JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
try {
return readMessagesArray(reader);
} finally {
reader.close();
}
}
public List<Message> readMessagesArray(JsonReader reader) throws IOException {
List<Message> messages = new ArrayList<Message>();
reader.beginArray();
while (reader.hasNext()) {
messages.add(readMessage(reader));
}
reader.endArray();
return messages;
}
public Message readMessage(JsonReader reader) throws IOException {
long id = -1;
String text = null;
User user = null;
List<Double> geo = null;
reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("id")) {
id = reader.nextLong();
} else if (name.equals("text")) {
text = reader.nextString();
} else if (name.equals("geo") && reader.peek() != JsonToken.NULL) {
geo = readDoublesArray(reader);
} else if (name.equals("user")) {
user = readUser(reader);
} else {
reader.skipValue();
}
}
reader.endObject();
return new Message(id, text, user, geo);
}
public List<Double> readDoublesArray(JsonReader reader) throws IOException {
List<Double> doubles = new ArrayList<Double>();
reader.beginArray();
while (reader.hasNext()) {
doubles.add(reader.nextDouble());
}
reader.endArray();
return doubles;
}
public User readUser(JsonReader reader) throws IOException {
String username = null;
int followersCount = -1;
reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("name")) {
username = reader.nextString();
} else if (name.equals("followers_count")) {
followersCount = reader.nextInt();
} else {
reader.skipValue();
}
}
reader.endObject();
return new User(username, followersCount);
}}
<h3>數字處理</h3> 此讀取器允許將數字值讀作字串,字串值則可讀成數字。 例如,JSON 陣列 [1, "1"] 的兩個元素都可以用 #nextInt 或 #nextString來讀取。 此行為旨在防止有損數值轉換:double 是 JavaScript 唯一的數值型別,且非常大的值 如 9007199254740993 Double 無法在該平台上精確表示。 為了減少精度損失,極大的值應該以 JSON 字串的形式寫入並讀取。
每個 JsonReader JSON 串流都可以用來讀取單一 JSON 串流。 此類別的實例並非執行緒安全。
Java 文件 android.util.JsonReader。
本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。
建構函式
| 名稱 | Description |
|---|---|
| JsonReader(Reader) |
建立一個新實例,從 中讀取 JSON 編碼的串流 |
屬性
| 名稱 | Description |
|---|---|
| Class |
回傳此 |
| Handle |
底層 Android 實例的帳號。 (繼承來源 Object) |
| HasNext |
如果目前陣列或物件有其他元素,則回傳為真。 |
| JniIdentityHashCode |
取得由互通執行時指派給此 Java 對等端的身份雜湊碼。 (繼承來源 Object) |
| JniManagedPeerState |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 (繼承來源 JavaObject) |
| JniPeerMembers |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 |
| Lenient |
如果這個解析器接受的範圍較寬鬆,則回傳為真。 -或者- 將這個解析器設定為它接受的範圍非常寬鬆。 |
| PeerReference |
取得這個 Java 節點的 JNI 物件參考。 (繼承來源 Object) |
| ThresholdClass |
此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。 (繼承來源 Object) |
| ThresholdType |
此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。 (繼承來源 Object) |
方法
| 名稱 | Description |
|---|---|
| BeginArray() |
消耗 JSON 串流中的下一個令牌,並斷言它是新陣列的起始。 |
| BeginArrayAsync() |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 |
| BeginObject() |
會消耗 JSON 串流中的下一個權杖,並斷言它是新物件的開始。 |
| BeginObjectAsync() |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 |
| Clone() |
建立並回傳此物件的副本。 (繼承來源 Object) |
| Close() |
關閉這個 JSON 讀取器及其底層 |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 (繼承來源 JavaObject) |
| Dispose() |
釋放該 Java 節點所持有的資源。 (繼承來源 Object) |
| Dispose(Boolean) |
釋放該 Java 節點所持有的資源。 (繼承來源 Object) |
| DisposeUnlessReferenced() |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 (繼承來源 JavaObject) |
| EndArray() |
消耗 JSON 串流中的下一個令牌,並斷言該標記為當前陣列的結束。 |
| EndArrayAsync() |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 |
| EndObject() |
會消耗 JSON 串流中的下一個權杖,並斷言它是當前物件的結束。 |
| EndObjectAsync() |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 |
| Equals(Object) |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 (繼承來源 JavaObject) |
| Equals(Object) |
表示是否有其他物體「等同」於此物。 (繼承來源 Object) |
| GetHashCode() |
回傳物件的雜湊碼值。 (繼承來源 Object) |
| JavaFinalize() |
當垃圾回收判定該物件不再有相關參考時,由垃圾回收器呼叫。 (繼承來源 Object) |
| NextBoolean() |
回傳 |
| NextBooleanAsync() |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 |
| NextDouble() |
回傳 |
| NextDoubleAsync() |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 |
| NextInt() |
回傳 |
| NextIntAsync() |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 |
| NextLong() |
回傳 |
| NextLongAsync() |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 |
| NextName() |
返回下一個標記 a |
| NextNameAsync() |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 |
| NextNull() |
會消耗 JSON 串流中的下一個令牌,並斷言它是字面上的空。 |
| NextNullAsync() |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 |
| NextString() |
回傳 |
| NextStringAsync() |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 |
| Notify() |
喚醒一個正在該物件監視器上等待的執行緒。 (繼承來源 Object) |
| NotifyAll() |
喚醒所有等待該物件監視器的執行緒。 (繼承來源 Object) |
| Peek() |
回傳下一個代幣的類型,但不消耗該代幣。 |
| PeekAsync() |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 |
| SetHandle(IntPtr, JniHandleOwnership) |
設定 Handle 屬性。 (繼承來源 Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 (繼承來源 JavaObject) |
| SkipValue() |
遞迴跳過下一個值。 |
| SkipValueAsync() |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 |
| ToArray<T>() |
從這個 Java 陣列包裝器建立一個受管理陣列。 (繼承來源 Object) |
| ToString() |
回傳物件的字串表示。 (繼承來源 Object) |
| UnregisterFromRuntime() |
將此 Java 節點從互通執行時中取消註冊。 (繼承來源 Object) |
| Wait() |
導致目前執行緒等待被喚醒,通常是透過 <em>通知</><em 或 em>中斷</em> 來喚醒。 (繼承來源 Object) |
| Wait(Int64, Int32) |
會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。 (繼承來源 Object) |
| Wait(Int64) |
會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。 (繼承來源 Object) |
明確介面實作
| 名稱 | Description |
|---|---|
| IJavaPeerable.Disposed() |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 (繼承來源 JavaObject) |
| IJavaPeerable.Finalized() |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 (繼承來源 JavaObject) |
| IJavaPeerable.JniObjectReferenceControlBlock |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 (繼承來源 JavaObject) |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 (繼承來源 JavaObject) |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 (繼承來源 JavaObject) |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 (繼承來源 JavaObject) |
| IJavaPeerable.UnregisterFromRuntime() |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 |
擴充方法
| 名稱 | Description |
|---|---|
| GetJniTypeName(IJavaPeerable) |
取得實例 |
| JavaAs<TResult>(IJavaPeerable) |
試著強制 |
| JavaCast<TResult>(IJavaObject) |
執行 Android 執行時檢查型別轉換。 |
| JavaCast<TResult>(IJavaObject) |
讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
試著強制 |