欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 八卦 > Gson使用TypeAdapterFactory和TypeAdapter实现Json中的Key统一修改

Gson使用TypeAdapterFactory和TypeAdapter实现Json中的Key统一修改

2024/10/24 8:23:13 来源:https://blog.csdn.net/u012854870/article/details/140626672  浏览:    关键词: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;}@Overridepublic <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>() {@Overridepublic 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);}}@Overridepublic 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;}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com