package com.stripe.model;

import static com.stripe.net.APIResource.GSON;

import com.google.gson.*;
import com.stripe.net.APIResource;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class ExpandableFieldDeserializer implements JsonDeserializer<ExpandableField> {
	public ExpandableField deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
		if (json.isJsonNull()) {
			return null;
		}

		ExpandableField expandableField;

		// Check if json is a String ID. If so, the field has not been expanded, so we only need to serialize a String
		// and create a new ExpandableField with the String id only.
		if (json.isJsonPrimitive()) {
			JsonPrimitive jsonPrimitive = json.getAsJsonPrimitive();
			if (jsonPrimitive.isString()) {
				expandableField = new ExpandableField(jsonPrimitive.getAsString(), null);
				return expandableField;
			}
			else {
				throw new JsonParseException("ExpandableField is a non-string primitive type.");
			}
		}
		// Check if json is an expanded Object. If so, the field has been expanded, so we need to serialize it into the
		// proper typeOfT, and create an ExpandableField with both the String id and this serialized object.
		else if (json.isJsonObject()) {
			// Get the `id` out of the response
			JsonObject fieldAsJsonObject = json.getAsJsonObject();
			String id = fieldAsJsonObject.getAsJsonPrimitive("id").getAsString();
			// We need to get the type inside the generic ExpandableField to make sure fromJson correctly serializes
			// the JsonObject:
			Type clazz = ((ParameterizedType) typeOfT).getActualTypeArguments()[0];
			expandableField = new ExpandableField(id, (HasId) GSON.fromJson(json, clazz));
			return expandableField;
		}

		// If json is neither a String nor an Object, error. (We expect all expandable objects to fit the known
		// string-or-object design. If one doesn't, then something may have changed in the API and this code may need to be updated.)
		throw new JsonParseException("ExpandableField is a non-object, non-primitive type.");
	}
}
package com.stripe.model;

import com.google.gson.*;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class ExpandableFieldDeserializer implements JsonDeserializer<ExpandableField> {
	public ExpandableField deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
		if (json.isJsonNull()) {
			return null;
		}

		ExpandableField expandableField;

		// Check if json is a String ID. If so, the field has not been expanded, so we only need to serialize a String
		// and create a new ExpandableField with the String id only.
		if (json.isJsonPrimitive()) {
			JsonPrimitive jsonPrimitive = json.getAsJsonPrimitive();
			if (jsonPrimitive.isString()) {
				expandableField = new ExpandableField(jsonPrimitive.getAsString(), null);
				return expandableField;
			}
			else {
				throw new JsonParseException("ExpandableField is a non-string primitive type.");
			}
		}
		// Check if json is an expanded Object. If so, the field has been expanded, so we need to serialize it into the
		// proper typeOfT, and create an ExpandableField with both the String id and this serialized object.
		else if (json.isJsonObject()) {
			// Get the `id` out of the response
			JsonObject fieldAsJsonObject = json.getAsJsonObject();
			String id = fieldAsJsonObject.getAsJsonPrimitive("id").getAsString();
			// We need to get the type inside the generic ExpandableField to make sure fromJson correctly serializes
			// the JsonObject:
			Type clazz = ((ParameterizedType) typeOfT).getActualTypeArguments()[0];
			expandableField = new ExpandableField(id, (HasId)context.deserialize(json, clazz));
			return expandableField;
		}

		// If json is neither a String nor an Object, error. (We expect all expandable objects to fit the known
		// string-or-object design. If one doesn't, then something may have changed in the API and this code may need to be updated.)
		throw new JsonParseException("ExpandableField is a non-object, non-primitive type.");
	}
}
Use current deserialization context instead of explicitly the APIResource context