package com.hdl.sdk.connect.cloud; import androidx.annotation.NonNull; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonParseException; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import com.google.gson.JsonSyntaxException; import com.google.gson.TypeAdapter; import com.google.gson.TypeAdapterFactory; import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; import java.io.IOException; import java.lang.reflect.Type; /** * Created by Tong on 2021/11/10. */ public class GsonUtils { private static Gson gson; public static T copy(Object o, Class type) { return copy(o, TypeToken.get(type)); } public static T copy(Object o, TypeToken type) { return copy(o, type.getType()); } public static T copy(Object o, Type type) { try { Gson gson = getGson(); return gson.fromJson(gson.toJson(o), type); } catch (Exception e) { e.printStackTrace(); } return null; } public static T fromJson(String json, Type type) { try { Gson gson = getGson(); return gson.fromJson(json, type); } catch (Exception e) { e.printStackTrace(); } return null; } public static T fromJson(String json, Class type) { try { Gson gson = getGson(); return gson.fromJson(json, type); } catch (Exception e) { e.printStackTrace(); } return null; } public static T fromJson(String json) { try { Gson gson = getGson(); return gson.fromJson(json, new TypeToken() { }.getType()); } catch (Exception e) { e.printStackTrace(); } return null; } public static String toJson(Object object) { try { return getGson().toJson(object); } catch (Exception e) { e.printStackTrace(); } return null; } public static Type getType(@NonNull final Type rawType, @NonNull final Type... typeArguments) { return TypeToken.getParameterized(rawType, typeArguments).getType(); } public static Gson getGson() { if (gson == null) { gson = new GsonBuilder() .disableHtmlEscaping() .registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory()) .registerTypeAdapter(String.class, new StringAdapter()) .registerTypeAdapter(Integer.class, new IntegerDefaultAdapter()) .registerTypeAdapter(Double.class, new DoubleDefaultAdapter()) .registerTypeAdapter(Long.class, new LongDefaultAdapter()) .create(); } return gson; } /** * * @param o * @param * @return */ public static JsonArray toJsonArray(Object o) { try { return getGson().fromJson(GsonUtils.toJson(o), new TypeToken() { }.getType()); } catch (Exception e) { return null; } } private static class StringAdapter implements JsonSerializer, JsonDeserializer { @Override public String deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { if (json instanceof JsonPrimitive) { return json.getAsString(); } else { return json.toString(); } } @Override public JsonElement serialize(String src, Type typeOfSrc, JsonSerializationContext context) { return new JsonPrimitive(src); } } private static class IntegerDefaultAdapter implements JsonSerializer, JsonDeserializer { @Override public Integer deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { try { if (json.getAsString().equals("") || json.getAsString().equals("null")) { return 0; } } catch (Exception ignore) { } try { return json.getAsInt(); } catch (NumberFormatException e) { throw new JsonSyntaxException(e); } } @Override public JsonElement serialize(Integer src, Type typeOfSrc, JsonSerializationContext context) { return new JsonPrimitive(src); } } private static class DoubleDefaultAdapter implements JsonSerializer, JsonDeserializer { @Override public Double deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { try { if (json.getAsString().equals("") || json.getAsString().equals("null")) { return 0.00; } } catch (Exception ignore) { } try { return json.getAsDouble(); } catch (NumberFormatException e) { throw new JsonSyntaxException(e); } } @Override public JsonElement serialize(Double src, Type typeOfSrc, JsonSerializationContext context) { return new JsonPrimitive(src); } } private static class LongDefaultAdapter implements JsonSerializer, JsonDeserializer { @Override public Long deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { try { if (json.getAsString().equals("") || json.getAsString().equals("null")) { return 0L; } } catch (Exception ignore) { } try { return json.getAsLong(); } catch (NumberFormatException e) { throw new JsonSyntaxException(e); } } @Override public JsonElement serialize(Long src, Type typeOfSrc, JsonSerializationContext context) { return new JsonPrimitive(src); } } private static class NullStringToEmptyAdapterFactory implements TypeAdapterFactory { public TypeAdapter create(Gson gson, TypeToken type) { Class rawType = (Class) type.getRawType(); if (rawType != String.class) { return null; } return (TypeAdapter) new StringNullAdapter(); } } public static class StringNullAdapter extends TypeAdapter { @Override public String read(JsonReader reader) throws IOException { if (reader.peek() == JsonToken.NULL) { reader.nextNull(); return ""; } return reader.nextString(); } @Override public void write(JsonWriter writer, String value) throws IOException { if (value == null) { writer.nullValue(); return; } writer.value(value); } } }