如果按重要性,对Gson中的类排个序,JsonReader绝对排在第一,它是底层真正解析json格式数据的支持类,非常值得一看。
我们来看一个简单的解析。
String json = "{\"name\":\"王成wisely\",\"age\":\"24\"}";
private void readJson2User(){
User user = new User();
StringReader reader = new StringReader(json);
JsonReader jsonReader = new JsonReader(reader);
try {
jsonReader.beginObject();
while (jsonReader.hasNext()){
String name = jsonReader.nextName();
switch (name){
case "name":
user.name = jsonReader.nextString();
break;
case "age":
user.age = jsonReader.nextInt();
break;
}
}
jsonReader.endObject();
} catch (IOException e) {
e.printStackTrace();
}
}
一、构造方法
我们来看JsonReader的构造方法,如下:
private int[] stack = new int[32];
private int stackSize = 0;
{
stack[stackSize++] = JsonScope.EMPTY_DOCUMENT;
}
public JsonReader(Reader in) {
if (in == null) {
throw new NullPointerException("in == null");
}
this.in = in;
}
JsonReader的构造方法,需要一个Reader的实例,它的作用是用来读取json格式的数据流。上面的代码中,除了构造方法外,还有一个静态代码块,初始化了一个名为stack的数组的第0项,后面会用到。
二、beginObject()
int peeked = PEEKED_NONE;
public void beginObject() throws IOException {
int p = peeked;
if (p == PEEKED_NONE) {
p = doPeek();
}
if (p == PEEKED_BEGIN_OBJECT) {
push(JsonScope.EMPTY_OBJECT);
peeked = PEEKED_NONE;
} else {
throw new IllegalStateException("Expected BEGIN_OBJECT but was " + peek() + locationString());
}
}
peeked是个很重要的变量,默认值为PEEKED_NONE。在上面的方法中,调用了一个方法doPeek(),这个类可以说是JsonReader类的核心方法之一。
三、doPeek()
int doPeek() thro