Десериализовать JSON с логическим или объектным полем - PullRequest
0 голосов
/ 06 июня 2018

Я использую Retrofit и GSON и получаю Json следующим образом:

{
    "firstName": "John",
    "lastName": "Doe",
    "passporRf": {
        "number": "996633",
        "series": "1111",        
        "code": "66666"
    }

}

А когда у пользователя есть паспорт - это поля логические со значением "ложь".

Как правильно десериализовать его и получить логическое значение - false, если это поле логическое, и получить объект JSON, когда его объект.Я нашел JSONDeserializer, но я не могу использовать его правильно.Код:

public class DocumentDeserializer implements JsonDeserializer<Passport> {


    @Override
    public Passport deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonPrimitive primitive = json.getAsJsonPrimitive();
        if (primitive.isBoolean()) {
            // What value do i have to return here?
        }
        return context.deserialize(json, Passport.class);
    }
}

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Код указан ниже,

Sample.class

import com.google.gson.Gson;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.List;

/**
 * Class containing news information in form of POJO.
 */
public class Sample {


  public String firstName;


  public String lastName;


  private List<SampleOne> passporRf;

  public List<SampleOne> getPassporRf() {
    return passporRf;
  }

  private void setPassporRf(List<SampleOne> passporRf) {
    this.passporRf = passporRf;
  }

  // Using custom DeSerializer for "multimedia" object since the API is just "Great"
  public static class SampleDetailsDeSerializer implements JsonDeserializer<Sample> {

    @Override
    public Sample deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
      Sample accountState = new Gson().fromJson(json, Sample.class);
      JsonObject jsonObject = json.getAsJsonObject();

      if (jsonObject.has("passporRf")) {
        JsonElement elem = jsonObject.get("passporRf");
        if (elem != null && !elem.isJsonNull()) {
          if(elem.isJsonPrimitive()){
            accountState.setPassporRf(null);
          } else {
            final List<SampleOne> passporRfList = new Gson().fromJson(elem.getAsJsonArray().toString()
              , new TypeToken<List<SampleOne>>(){}.getType());
            accountState.setPassporRf(passporRfList);
          }
        }
      }
      return accountState ;
    }
  }

}

SampleOne.class

public class SampleOne {
  public String number;
  public String series;
  public String code;
}

Надеюсь, это может помочь вам.

0 голосов
/ 06 июня 2018

Не используйте GSon и другие библиотеки привязок.Ничто не может быть привязано к «булевому или объектному», поэтому не пытайтесь.

Используйте анализатор JSON и посмотрите на содержимое JSON, чтобы получить необходимую информацию.Возможно построить объект User из информации, которую вы можете найти.

...