gpt4 book ai didi

java - GSON 如何决定它在反序列化过程中使用哪个 TypeAdapter?

转载 作者:太空宇宙 更新时间:2023-11-03 15:38:06 25 4
gpt4 key购买 nike

我遇到了问题,App Engine 将 Long/long 值返回为“String”。这是返回的 JSON 文件的一部分:

  "stringObject" : "This is a string.",
"integerPrimitive" : -3,
"intergerObject" : 3333,
"longPrimitive" : "1234567890123456789",
"longObject" : "1234567890123456789",

以及产生它的服务器端数据类型:

private String stringObject = "This is a string.";
private int integerPrimitive = -3;
private Integer intergerObject = 3333;
private long longPrimitive = 1234567890123456789L;
private Long longObject = 1234567890123456789L;

我已经写了一个 TypeAdapter 来处理 Long,但是在反序列化过程中,GSON 似乎并不看目标变量,而是看 JSON 本身。换句话说:它似乎仍然为 Long/long 调用 String TypeAdapter,至少我的 TypeAdapter 中的断点从未达到(不过这也可能是反射的产物)。这是可能的还是我的 TypeAdapter 有其他问题? GSON 如何确定它调用哪个适配器。

public class LongTypeAdapter extends TypeAdapter<Long> {

// Long/long is converted to String by AppEngine 0L -> "0"

@Override public void write(JsonWriter writer, Long value) throws IOException {
if (value == null) {
writer.nullValue();
return;
}
String text = "\"" + String.valueOf(value) + "\"";
writer.value(text);
}

@Override public Long read(JsonReader reader) throws IOException {
if (reader.peek() == JsonToken.NULL) {
reader.nextNull();
return null;
}
String text = reader.nextString();
text = text.replaceAll("\"", "");
Long value = Long.parseLong(text);
return value;
}

}

我调试到 GSON 并且我的适配器已正确注册,所以我很可能会在此处排除注册问题。


适配器是这样注册的:

public class Backend {

// Singleton
private static volatile BackendInterface service = null;
private Backend() {} // exists only to defeat instantiation

public static BackendInterface api() {
if (service == null) { // lazy initialization

final Gson gson = new GsonBuilder()
.registerTypeAdapter(Long.class, new LongTypeAdapter())
.create();

RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(Constants.BACKEND_API_ENDPOINT)
.setClient(new OkClient())
.setLogLevel(RestAdapter.LogLevel.FULL) // TODO remove full logging for production
.setConverter(new GsonConverter(gson))
.build();

service = restAdapter.create(BackendInterface.class);

}
return service;
}

}

下面是我如何使用它:

Test test = Backend.api().getTest(2L);

最佳答案

那么您必须注册新型适配器:

final Gson gson = new GsonBuilder().registerTypeAdapter(Long.class,
new LongTypeAdapter()).create();

希望对你有帮助

关于java - GSON 如何决定它在反序列化过程中使用哪个 TypeAdapter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25298409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com