JsonReader 类

定义

将 JSON(RFC 4627)编码的值作为令牌流读取。

[Android.Runtime.Register("android/util/JsonReader", DoNotGenerateAcw=true)]
public sealed class JsonReader : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, 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)编码的值作为令牌流读取。 此流包括文本值(字符串、数字、布尔值和 null)以及对象和数组的开始和结束分隔符。 令牌按深度优先顺序遍历,其顺序与 JSON 文档中显示的顺序相同。 在 JSON 对象中,名称/值对由单个令牌表示。

<h3>分析 JSON</h3> 若要为自己的 JSON 流创建递归下降分析器,请先创建创建一个 JsonReader入口点方法。

接下来,为 JSON 文本中的每个结构创建处理程序方法。 对于每个对象类型和每个数组类型,都需要一个方法。 <ul>li 在强数组处理</强>方法中,首先调用#beginArray以使用数组的左括号。><>< 然后创建一个 while 循环,该循环累积值,终止时间 #hasNext 为 false。 最后,通过调用 #endArray读取数组的右括号。 <li>在强>对象处理</强>方法中<,首先调用#beginObject以使用对象的左大括号。 然后,创建一个 while 循环,该循环基于其名称将值分配给本地变量。 此循环应在 false 时 #hasNext 终止。 最后,通过调用 #endObject读取对象的右大括号。 </ul>

遇到嵌套对象或数组时,委托给相应的处理程序方法。

遇到未知名称时,严格分析程序应失败并出现异常。 Lenient 分析器应调用 #skipValue() 以递归方式跳过值的嵌套令牌,否则可能会发生冲突。

如果值可能为 null,则应首先检查使用 #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. 此行为旨在防止丢失的数字转换:双精度是 JavaScript 的唯一数值类型,并且无法 9007199254740993 完全在该平台上表示这样的大值。 为了尽量减少精度损失,应以 JSON 格式写入和读取非常大的值。

每个 JsonReader 流都可用于读取单个 JSON 流。 此类的实例不是线程安全的。

Java文档android.util.JsonReader

本页的某些部分是根据 创建和共享的工作进行的修改,并根据 许可证中所述的条款使用。

构造函数

名称 说明
JsonReader(Reader)

创建从中读取 JSON 编码流 in的新实例。

属性

名称 说明
Class

返回此 Object的运行时类。

(继承自 Object)
Handle

基础 Android 实例的句柄。

(继承自 Object)
HasNext

如果当前数组或对象具有另一个元素,则返回 true。

JniIdentityHashCode

将 JSON(RFC 4627)编码的值作为令牌流读取。

(继承自 Object)
JniPeerMembers

将 JSON(RFC 4627)编码的值作为令牌流读取。

Lenient

如果此分析器在接受的内容中是自由派的,则返回 true。 - 或 - 将此分析器配置为在接受的内容中是自由派的。

PeerReference

将 JSON(RFC 4627)编码的值作为令牌流读取。

(继承自 Object)
ThresholdClass

此 API 支持 Mono for Android 基础结构,不打算直接从代码使用。

(继承自 Object)
ThresholdType

此 API 支持 Mono for Android 基础结构,不打算直接从代码使用。

(继承自 Object)

方法

名称 说明
BeginArray()

使用 JSON 流中的下一个令牌,并断言它是新数组的开头。

BeginArrayAsync()

将 JSON(RFC 4627)编码的值作为令牌流读取。

BeginObject()

使用 JSON 流中的下一个令牌,并断言它是新对象的开头。

BeginObjectAsync()

将 JSON(RFC 4627)编码的值作为令牌流读取。

Clone()

创建并返回此对象的副本。

(继承自 Object)
Close()

关闭此 JSON 读取器和基础 Reader

Dispose()

将 JSON(RFC 4627)编码的值作为令牌流读取。

(继承自 Object)
Dispose(Boolean)

将 JSON(RFC 4627)编码的值作为令牌流读取。

(继承自 Object)
EndArray()

使用 JSON 流中的下一个令牌,并断言它是当前数组的末尾。

EndArrayAsync()

将 JSON(RFC 4627)编码的值作为令牌流读取。

EndObject()

使用 JSON 流中的下一个令牌,并断言它是当前对象的末尾。

EndObjectAsync()

将 JSON(RFC 4627)编码的值作为令牌流读取。

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

返回下一个标记,一个 JsonToken#NAME property name,并使用它。

NextNameAsync()

将 JSON(RFC 4627)编码的值作为令牌流读取。

NextNull()

使用 JSON 流中的下一个令牌,并断言它是文本 null。

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

以递归方式跳过下一个值。

SkipValueAsync()

将 JSON(RFC 4627)编码的值作为令牌流读取。

ToArray<T>()

将 JSON(RFC 4627)编码的值作为令牌流读取。

(继承自 Object)
ToString()

返回对象的字符串表示形式。

(继承自 Object)
UnregisterFromRuntime()

将 JSON(RFC 4627)编码的值作为令牌流读取。

(继承自 Object)
Wait()

使当前线程等待,直到唤醒它,通常是通过 em 通知/em< 或 >em<interrupted>/em<。><>

(继承自 Object)
Wait(Int64, Int32)

使当前线程等待直到唤醒,通常是通过 <em>通知</em> 或 <em interrupted>/em<>,或直到经过一定数量的实时。

(继承自 Object)
Wait(Int64)

使当前线程等待直到唤醒,通常是通过 <em>通知</em> 或 <em interrupted>/em<>,或直到经过一定数量的实时。

(继承自 Object)

显式接口实现

名称 说明
IJavaPeerable.Disposed()

将 JSON(RFC 4627)编码的值作为令牌流读取。

(继承自 Object)
IJavaPeerable.DisposeUnlessReferenced()

将 JSON(RFC 4627)编码的值作为令牌流读取。

(继承自 Object)
IJavaPeerable.Finalized()

将 JSON(RFC 4627)编码的值作为令牌流读取。

(继承自 Object)
IJavaPeerable.JniManagedPeerState

将 JSON(RFC 4627)编码的值作为令牌流读取。

(继承自 Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

将 JSON(RFC 4627)编码的值作为令牌流读取。

(继承自 Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

将 JSON(RFC 4627)编码的值作为令牌流读取。

(继承自 Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

将 JSON(RFC 4627)编码的值作为令牌流读取。

(继承自 Object)

扩展方法

名称 说明
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端有效。

适用于