Android 如何迭代JsonReader两次?

Android 如何迭代JsonReader两次?,android,gson,Android,Gson,我面临以下问题:我有这样的json { "type": "objectType", "body": { //could be one of five different object types } } “body”可能是一组固定类型之一,因此我尝试实现自定义TypeAdapter: @Override public MyObject read(final JsonReader pJsonReader) throws IOException {

我面临以下问题:我有这样的json

{
    "type": "objectType",
    "body": {
         //could be one of five different object types
    }
}
“body”
可能是一组固定类型之一,因此我尝试实现自定义TypeAdapter:

@Override
public MyObject read(final JsonReader pJsonReader) throws IOException {
    if (pJsonReader.peek() == JsonToken.NULL) {
        pJsonReader.nextNull();
        return null;
    }

    pJsonReader.beginObject();
    String type = null;

    while (pJsonReader.hasNext()) {
        final String fieldName = pJsonReader.nextString();

        if (pJsonReader.peek() == JsonToken.NULL) {
            pJsonReader.nextNull();
            continue;
        }

        switch (fieldName) {
            case TYPE: {
                tyoe = mStringTypeAdapter.read(pJsonReader);
                break;
            }
            case BODY: {
                body = //I need to choose a particular TypeAdapter basing on type field
            }
            default: {
                pJsonReader.skipValue();
            }
        }
    }

    pJsonReader.endObject();

    return MyObject(type, body);
}
问题是,我需要根据
“type”
“body”
选择TypeAdapter,因此我需要以某种方式复制JsonReader steam,并在找到
“type”
值时再次迭代它。
知道我该怎么做吗?

如果您控制JSON的结构,那么最好嵌套主体,以便始终能够首先读取类型

但是,如果无法更改JSON的结构,则可以使用创建内存中的表示,然后从中读取相应的类型适配器:

公共类MyObjectTypeAdapter扩展了TypeAdapter{
@凌驾
public void write(JsonWriter out,MyObject值)抛出IOException{
//如果您需要,您必须执行此操作
//还要编写JSON数据
抛出新的UnsupportedOperationException();
}
@凌驾
公共MyObject读取(JsonReader in)引发IOException{
if(in.peek()==JsonToken.NULL){
in.nextNull();
返回null;
}
字符串类型=null;
JsonElement body=null;
in.beginObject();
while(在.hasNext()中){
String fieldName=in.nextString();
if(in.peek()==JsonToken.NULL){
in.nextNull();
继续;
}
交换机(字段名){
案例“类型”:{
type=in.nextString();
打破
}
案例“正文”:{
body=JsonParser.parseReader(in);
打破
}
默认值:{
in.skipValue();
}
}
}
in.endObject();
//获取`类型的相应适配器`
//可能还必须使用
//TypeAdapterFactory能够使用Gson进行适配器查找
类型适配器bodyAdapter=。。。
返回新的MyObject(类型,bodyAdapter.fromJsonTree(body));
}
}

这不会有那么高的效率,但如果主体没有那么复杂,这应该不是一个大问题。

为什么
再次迭代它?
body
标记位于
type
@muratgu之后,因为我不能确定我会得到一个顺序相反的json,第一部分是“body”
,第二部分是“type”android gson阅读器没有
重置功能。但是,您可以重新创建读取器,并在同一个流上调用它两次,一次用于标识类型,第二次用于主体。