我正在使用Gson
来处理json。
我收到了这种格式的json:
{
"name": "Paul Matt",
"age": "120",
"phone": "00123456789",
"email": "paul@matt.com"
}
我无法改变这个json的格式。
如果反序列化到这个类:
@SerializedName("name")
@Expose
public String name;
@SerializedName("age")
@Expose
public String age;
@SerializedName("phone")
@Expose
public String phone;
@SerializedName("email")
@Expose
public String email;
但我真正想要的是将json反序列化为类似这样的类:
public Person person; //name and age goes here
public PersonContacts contacts; // email and phone goes here
实现这一目标的最佳途径是什么?
答案 0 :(得分:1)
在这种情况下,您应该手动解析JSON。 在Gson图书馆,我们有两种可能实现这一目标:
streaming
反序列化器并解析每个令牌; JsonDeserializer
的实现并解析就绪JsonElement
对象。这里有一些例子:
第一种方法:
public class StreamUserDeserializer extends TypeAdapter<User> {
@Override
public void write(JsonWriter out, List<CMPoint> value) throws IOException {
}
@Override
public User read(JsonReader in) throws IOException {
User user = new User();
in.beginObject();
while (in.hasNext()) {
switch (in.nextName()) {
case "name":
user.getPerson().setName(in.nextString());
break;
case "age":
user.getPerson().setAge(in.nextInt());
break;
case "phone":
user.getPersonContacts().setPhone(in.nextString());
break;
case "email":
user.getPersonContacts().setEmail(in.nextString());
break;
default:
in.skipValue();
}
}
in.endObject();
return user;
}
}
第二种方法:
public class JsonElementUserDeserializer implements JsonDeserializer<User> {
@Override
public User deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context)
throws JsonParseException {
JsonObject userObject = json.getAsJsonObject();
User user = new User();
user.getPerson().setName(userObject.get("name").getAsString());
user.getPerson().setAge(userObject.get("age").getAsInt());
user.getPersonContacts().setPhone(userObject.get("phone").getAsString());
user.getPersonContacts().setAge(userObject.get("email").getAsString());
return user;
}
}