使用Gson解析时跳过级别

时间:2015-02-14 14:25:02

标签: json gson

我有一些json格式:

{
"root": {
    "user": {
        "name":"Name",
        "age":99,
        "another_obj": {
            "f1":"abc",
            "f2":1
        }
    }
},
"result_code": 0
}

我创建了一些模型:

class User {
private String name;
private int age;
@SerializedName("detail")
private Detail
}

class Detail{
   // Define something.
}

最后我创建了类名UserWapper。

class UserWapper {
@SerializedName("root")
private User user;  
}

解析json:

String json = "STRING_JSON_ABOVE";
Gson gson = new Gson();
UserWrapper uw = gson.fromJson(json, UserWrapper.class);

但目前我不想创建类Wrapper。因为我有很多班级。如果创建WrapperClass - > :|

我想做类似的事情:

User u = gson.fromJson(json, User.class).

(注意:我无法从服务器更改格式数据json。我也会搜索一些自定义gson适配器,但我找不到跳过的方法" level"另一个字段)

2 个答案:

答案 0 :(得分:3)

如果你不想要一个包装器类,可以将你的json字符串解析为JsonObject,然后获取它的user对象,并将用户对象反序列化为{{1}的实例}。class。

尝试以下代码:

User

<强>输出:

  

user.name:名称
  user.age:99

答案 1 :(得分:0)

我刚刚实现了另一种方法:在仅包含包装器对象的字段上注释JsonAdapter。 JsonAdapter实际上是一个TypeAdapterFactory,如下所示:

/**
 * Use with {@link com.google.gson.annotations.JsonAdapter} on fields to skip a single pseudo object
 * for map-like types.
 */
public class UnwrappingJsonAdapter implements TypeAdapterFactory {

    @Override
    public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> type) {
        return new TypeAdapter<T>() {

            @Override
            public void write(JsonWriter out, T value) throws IOException {
                out.beginObject();
                out.name(type.getType().getClass().getSimpleName());
                gson.toJson(value, type.getType(), out);
                out.endObject();
            }

            @Override
            public T read(JsonReader in) throws IOException {
                in.beginObject();
                in.nextName();
                final T object = gson.fromJson(in, type.getType());
                in.endObject();
                return object;
            }
        };
    }
}

这对我有用。其他人可能希望在序列化中自定义合成对象的名称。反序列化也不是很强大或灵活。