Gson使用TypeAdapterFactory和TypeAdapter实现Json中的Key统一修改
Gson使用TypeAdapterFactory和TypeAdapter实现Json中的Key统一修改,增加前后缀
package com.pl.zorro.ConverterFactory;
import static com.google.gson.stream.JsonToken.BEGIN_OBJECT;
import androidx.annotation.NonNull;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
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.util.Map;
/**
* @Author PangLi
* @Date 2024/7/19 14:55
* @Description PrefixSuffixTypeAdapterFactory
*
* <p>As with type adapters, factories must be <i>registered</i> with {@link
* com.google.gson.GsonBuilder} and {@link retrofit2.converter.gson.GsonConverterFactory} for them to take effect:
* <pre>
* {@code
* GsonBuilder builder = new GsonBuilder();
* builder.registerTypeAdapterFactory(new PrefixSuffixTypeAdapterFactory("Zorro_","_Zorro"));
* Gson gson = builder.create();
* GsonConverterFactory gsonFactory = GsonConverterFactory.create(gson);
* }
* </pre>
*/
public class PrefixSuffixTypeAdapterFactory implements TypeAdapterFactory {
private final String prefix;
private final String suffix;
public PrefixSuffixTypeAdapterFactory(String prefix, String suffix) {
this.prefix = prefix;
this.suffix = suffix;
}
@Override
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);
return newPrefixSuffixTypeAdapter(delegate, elementAdapter);
}
private <T> @NonNull TypeAdapter<T> newPrefixSuffixTypeAdapter(TypeAdapter<T> delegate, TypeAdapter<JsonElement> elementAdapter) {
return new TypeAdapter<T>() {
@Override
public T read(JsonReader in) throws IOException {
JsonToken token = in.peek();
if (BEGIN_OBJECT == token) {
JsonObject targetJson = new JsonObject();
in.beginObject();
while (in.hasNext()) {
targetJson.add(prefix + in.nextName() + suffix, elementAdapter.read(in));
}
in.endObject();
return delegate.fromJsonTree(targetJson);
} else {
return delegate.read(in);
}
}
@Override
public void write(JsonWriter out, T value) throws IOException {
JsonElement jsonElement = delegate.toJsonTree(value);
if (!jsonElement.isJsonObject()) {
delegate.write(out, value);
return;
}
elementAdapter.write(out, newJsonObject(jsonElement, new JsonObject()));
}
};
}
private JsonObject newJsonObject(JsonElement jsonElement, JsonObject targetJson) {
JsonObject jsonObject = jsonElement.getAsJsonObject();
for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
targetJson.add(prefix + entry.getKey() + suffix, entry.getValue());
}
return targetJson;
}
}
原文地址:https://blog.csdn.net/u012854870/article/details/140626672
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!