Gson源码的研读-2015/10/9

当前发现最核心的代码如下:
 
 
public static final TypeAdapter<JsonElement> JSON_ELEMENT = new TypeAdapter<JsonElement>() {
  @Override public JsonElement read(JsonReader in) throws IOException {
    switch (in.peek()) {
    case STRING:
      return new JsonPrimitive(in.nextString());
    case NUMBER:
      String number = in.nextString();
      return new JsonPrimitive(new LazilyParsedNumber(number));
    case BOOLEAN:
      return new JsonPrimitive(in.nextBoolean());
    case NULL:
      in.nextNull();
      return JsonNull.INSTANCE;
    case BEGIN_ARRAY:
      JsonArray array = new JsonArray();
      in.beginArray();
      while (in.hasNext()) {
        array.add(read(in));
      }
      in.endArray();
      return array;
    case BEGIN_OBJECT:
      JsonObject object = new JsonObject();
      in.beginObject();
      while (in.hasNext()) {
        object.add(in.nextName(), read(in));
      }
      in.endObject();
      return object;
    case END_DOCUMENT:
    case NAME:
    case END_OBJECT:
    case END_ARRAY:
    default:
      throw new IllegalArgumentException();
    }
  }
 
 
以上代码返回各种具体类型的element
下面的代码用于对text继续遍历
 
 
/**
 * Returns the type of the next token without consuming it.
 */
public JsonToken peek() throws IOException {
  if (token != null) {
    return token;
  }

  switch (stack[stackSize - 1]) {
  case EMPTY_DOCUMENT:
    if (lenient) {
      consumeNonExecutePrefix();
    }
    stack[stackSize - 1] = JsonScope.NONEMPTY_DOCUMENT;
    JsonToken firstToken = nextValue();
    if (!lenient && token != JsonToken.BEGIN_ARRAY && token != JsonToken.BEGIN_OBJECT) {
      throw new IOException("Expected JSON document to start with '[' or '{' but was " + token
          + " at line " + getLineNumber() + " column " + getColumnNumber());
    }
    return firstToken;
  case EMPTY_ARRAY:
    return nextInArray(true);
  case NONEMPTY_ARRAY:
    return nextInArray(false);
  case EMPTY_OBJECT:
    return nextInObject(true);
  case DANGLING_NAME:
    return objectValue();
  case NONEMPTY_OBJECT:
    return nextInObject(false);
  case NONEMPTY_DOCUMENT:
    int c = nextNonWhitespace(false);
    if (c == -1) {
      return JsonToken.END_DOCUMENT;
    }
    pos--;
    if (!lenient) {
      throw syntaxError("Expected EOF");
    }
    return nextValue();
  case CLOSED:
    throw new IllegalStateException("JsonReader is closed");
  default:
    throw new AssertionError();
  }
}
 
如下的代码是一个出口,分析的结果会保存到members中
 
public void add(String property, JsonElement value) {
  if (value == null) {
    value = JsonNull.INSTANCE;
  }
  members.put($Gson$Preconditions.checkNotNull(property), value);
}
 
当前的问题是peek和read是如何串起来的呢?
:在read的过程中,peek会一直调用,对内容的标志进一步分析,
待续!!
 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值