这和How do I deserialize Json with modifying the structure?几乎是同一个问题,只是你的json结构不同。请阅读那里的说明以获取更多详细信息。如果您的示例比您在问题中提供的示例更复杂,请阅读完整答案以了解如何进一步修改它。
你可以使用这个TypeAdapter<Person>来做你想要的解析:
import java.io.IOException;
import com.google.gson.*;
import com.google.gson.stream.*;
public class PersonTypeAdapter extends TypeAdapter<Person> {
@Override
public void write(JsonWriter out, Person value) throws IOException {
if (value == null) {
out.nullValue();
return;
}
out.nullValue();
// exercise for you, if you even need it
}
@Override
public Person read(JsonReader reader) throws IOException {
if (reader.peek() == JsonToken.NULL) {
reader.nextNull();
return null;
}
reader.beginObject();
validateName(reader, "name");
String name = reader.nextString();
validateName(reader, "address");
reader.beginObject();
validateName(reader, "addressName");
String addressName = reader.nextString();
validateName(reader, "addressList");
reader.beginArray();
reader.beginObject();
validateName(reader, "State");
String addressState1 = reader.nextString();
validateName(reader, "City");
String addressCity1 = reader.nextString();
reader.endObject();
reader.beginObject();
validateName(reader, "State");
String addressState2 = reader.nextString();
validateName(reader, "City");
String addressCity2 = reader.nextString();
reader.endObject();
reader.endArray();
reader.endObject();
reader.endObject();
return new Person(name, addressName,
addressState1, addressCity1,
addressState2, addressCity2);
}
private void validateName(JsonReader reader, String string) throws IOException {
String name = reader.nextName();
if(!string.equals(name)) {
throw new JsonSyntaxException("Expected: \"" + string + "\", got \"" + name + "\"");
}
}
}
然后,只需向您的GsonBuilder 注册即可:
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Person.class, new PersonTypeAdapter());
Gson g = builder.create();
Person person = g.fromJson(jsonString, Person.class);