获取内部数据JsonReader android

时间:2016-02-17 16:45:51

标签: java android json gson

所以我一直在四处寻找,我不确定如何处理这个问题。我正在解析看起来像这样的JSON

{
    "foo1" : { /* data I want */ },
    "foo2" : { /* data I want */ },
    "foo3" : { /* data I want */ },
    ...
}

因为我正在尝试浏览大文件,所以我正在使用流。我现在拥有的是

gson = new GsonBuilder().create();

JsonReader jReader = new JsonReader(new InputStreamReader(getResources()
                                            .openRawResource(R.raw.all_sets_x), "UTF-8"));

while (jReader.hasNext() && jReader.peek() != JsonToken.END_DOCUMENT) {
    Set set = gson.fromJson(jReader, Set.class);
    sets.add(set);
}

我的问题是我想跳过foo,只读取我想要的{/ *数据* /}。我不知道我可能得到的所有不同的形式。当我尝试跳过它时会跳过外部大括号,但是当我在beginObject时,它会使用我想要的数据在大括号内的字符串上出错。我相信我可能会遗漏一些简单的东西,但对于我的生活,我不确定。我看着尝试使用beginObject来创建一个json对象并使用gson解析它,但我在那里也没有成功。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

好的,所以我明白了。我间隔名称,这是错误的,而它是我对象中的一个字段,在这种情况下它也是对象标题的JSON(foo1)。我发现我可以通过

进入第一个对象
jsonReader.beginObject();

jsonReader.nextName();

while (jsonReader.hasNext() && jsonReader.peek() != JsonToken.END_DOCUMENT) {
    Set set = gson.fromJson(jsonReader, Set.class);
    sets.add(set);
    jsonToken = jsonReader.peek();
    if (jsonToken == JsonToken.NAME) {
        jsonReader.nextName();
    } else if (jsonToken != JsonToken.END_DOCUMENT) {
        jsonReader.endObject();
        jsonReader.skipValue();
        jsonToken = jsonReader.peek();
        if (jsonToken != JsonToken.END_DOCUMENT) {
            jsonReader.nextName();
        }
    }
}

这允许我得到第一个foo之后的{/ *数据我想要* /},以及之后的所有foos,我必须检查它是否是一个名字,因为我相信还有一个额外的结束对象在json对象中的某个地方。