語言

JsonReader 類別

定義

讀取一個 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
繼承
JsonReader
屬性
實作

備註

讀取一個 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 編碼的串流 in

屬性

名稱 Description
Class

回傳此 Object的執行時類別。

(繼承來源 Object)
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 讀取器及其底層 Reader的 .

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()

回傳 JsonToken#BOOLEAN boolean 下一個代幣的值,並消耗它。

NextBooleanAsync()

讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。

NextDouble()

回傳 JsonToken#NUMBER double 下一個代幣的值,並消耗它。

NextDoubleAsync()

讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。

NextInt()

回傳 JsonToken#NUMBER int 下一個代幣的值,並消耗它。

NextIntAsync()

讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。

NextLong()

回傳 JsonToken#NUMBER long 下一個代幣的值,並消耗它。

NextLongAsync()

讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。

NextName()

返回下一個標記 a JsonToken#NAME property name,並消耗它。

NextNameAsync()

讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。

NextNull()

會消耗 JSON 串流中的下一個令牌,並斷言它是字面上的空。

NextNullAsync()

讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。

NextString()

回傳 JsonToken#STRING string 下一個代幣的值,並消耗它。

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)

取得實例 self類型的 JNI 名稱。

JavaAs<TResult>(IJavaPeerable)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

JavaCast<TResult>(IJavaObject)

執行 Android 執行時檢查型別轉換。

JavaCast<TResult>(IJavaObject)

讀取一個 JSON(RFC 4627)編碼值,作為一串令牌。

TryJavaCast<TResult>(IJavaPeerable, TResult)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

適用於