Gson反序列化字段并创建对象

时间:2016-05-31 08:21:49

标签: java android json

我正在使用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

实现这一目标的最佳途径是什么?

1 个答案:

答案 0 :(得分:1)

在这种情况下,您应该手动解析JSON。 在Gson图书馆,我们有两种可能实现这一目标:

  1. 创建streaming反序列化器并解析每个令牌;
  2. 创建JsonDeserializer的实现并解析就绪JsonElement对象。
  3. 这里有一些例子:

    第一种方法

    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;
       }
    }