package com.stripe.model;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
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.JsonPrimitive;
import java.lang.reflect.Type;
public class DisputeDataDeserializer implements JsonDeserializer<Dispute> {
public Dispute deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create();
if (json.isJsonNull()) {
return null;
}
if (!json.isJsonObject()) {
throw new JsonParseException("Dispute type was not an object, which is problematic.");
}
// API Versions 2014-12-TODO and earlier use a string for evidence, and we've renamed that to evidenceString.
JsonObject disputeAsJsonObject = json.getAsJsonObject();
JsonElement rawEvidence = disputeAsJsonObject.get("evidence");
String evidenceString = null;
EvidenceSubObject evidenceSubObject = null;
if (rawEvidence.isJsonPrimitive()) {
JsonPrimitive evidenceJsonPrimitive = rawEvidence.getAsJsonPrimitive();
if (!evidenceJsonPrimitive.isString()) {
throw new JsonParseException("Evidence field on a dispute was a primitive non-string type.");
}
evidenceString = evidenceJsonPrimitive.getAsString();
} else if (rawEvidence.isJsonObject()) {
JsonObject evidenceJsonObject = rawEvidence.getAsJsonObject();
evidenceSubObject = gson.fromJson(evidenceJsonObject, EvidenceSubObject.class);
} else if (!rawEvidence.isJsonNull()) {
throw new JsonParseException("Evidence field on a dispute was a non-primitive, non-object type.");
}
disputeAsJsonObject.remove("evidence");
Dispute parsedData = gson.fromJson(json, typeOfT);
parsedData.setEvidence(evidenceString);
parsedData.setEvidenceSubObject(evidenceSubObject);
return parsedData;
}
}