App Engine中JSON反序列化Network Java对象报错求助
解决Gson反序列化Google Compute Network对象时的类型转换异常
你遇到的问题核心在于:Google Cloud Compute的模型类(比如Network和NetworkRoutingConfig)继承自GenericData——一个实现了Map的基础类,而Gson默认处理这类对象时,会把嵌套的复杂类型解析成LinkedTreeMap,而非对应的具体类,最终导致赋值时出现类型不匹配的异常。
下面给你两种可行的解决方案,优先推荐第一种,因为它是Google官方提供的适配方案,更简洁可靠:
方案1:使用Google API客户端自带的JSON解析工具
Google的API客户端库已经内置了和这些模型类完美兼容的JSON处理工具,不需要手动配置Gson的类型适配。你可以用GsonFactory来替代纯Gson进行序列化和反序列化:
修改后的代码如下:
package com.techm.studio.client; import java.io.IOException; import com.google.api.services.compute.model.Network; import com.google.api.services.compute.model.NetworkRoutingConfig; import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.json.JsonFactory; public class JSONTest { public static void main(String[] args) throws IOException { Network network = new Network(); network.setName("k-network"); network.setAutoCreateSubnetworks(false); network.setDescription("My test network on Google Cloud"); network.setIPv4Range("10.0.0.0/16"); network.setRoutingConfig(new NetworkRoutingConfig().setRoutingMode("REGIONAL")); // 使用Google官方的JsonFactory完成序列化 JsonFactory jsonFactory = new GsonFactory(); String nwkJsonString = jsonFactory.toString(network); System.out.println("JSON String from POJO ==>\n" + nwkJsonString); // 同样用JsonFactory完成反序列化 Network netwrkOut = jsonFactory.fromString(nwkJsonString, Network.class); System.out.println(netwrkOut.toPrettyString()); } }
这个方法的优势是完全适配Google的模型类,自动处理所有嵌套类型,不需要你编写任何额外的适配逻辑。
方案2:为Gson自定义类型适配器(纯Gson方案)
如果你坚持要用纯Gson,需要为Network类编写自定义的TypeAdapter,手动处理嵌套的NetworkRoutingConfig字段:
首先创建类型适配器类:
import com.google.api.services.compute.model.Network; import com.google.api.services.compute.model.NetworkRoutingConfig; import com.google.gson.TypeAdapter; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import com.google.gson.JsonObject; import com.google.gson.Gson; import java.io.IOException; public class NetworkTypeAdapter extends TypeAdapter<Network> { private final Gson gson = new Gson(); @Override public void write(JsonWriter out, Network value) throws IOException { // 将Network对象转为JsonObject再写入 JsonObject jsonObject = gson.toJsonTree(value).getAsJsonObject(); gson.getAdapter(JsonObject.class).write(out, jsonObject); } @Override public Network read(JsonReader in) throws IOException { JsonObject jsonObject = gson.getAdapter(JsonObject.class).read(in); Network network = new Network(); // 逐个读取字段并设置到Network对象 network.setName(jsonObject.get("name").getAsString()); network.setAutoCreateSubnetworks(jsonObject.get("autoCreateSubnetworks").getAsBoolean()); network.setDescription(jsonObject.get("description").getAsString()); network.setIPv4Range(jsonObject.get("IPv4Range").getAsString()); // 手动解析嵌套的routingConfig字段 JsonObject routingConfigJson = jsonObject.getAsJsonObject("routingConfig"); NetworkRoutingConfig routingConfig = new NetworkRoutingConfig(); routingConfig.setRoutingMode(routingConfigJson.get("routingMode").getAsString()); network.setRoutingConfig(routingConfig); return network; } }
然后在主类中注册这个适配器:
package com.techm.studio.client; import java.io.IOException; import com.google.api.services.compute.model.Network; import com.google.api.services.compute.model.NetworkRoutingConfig; import com.google.gson.Gson; import com.google.gson.GsonBuilder; public class JSONTest { public static void main(String[] args) throws IOException { Network network = new Network(); network.setName("k-network"); network.setAutoCreateSubnetworks(false); network.setDescription("My test network on Google Cloud"); network.setIPv4Range("10.0.0.0/16"); network.setRoutingConfig(new NetworkRoutingConfig().setRoutingMode("REGIONAL")); // 注册自定义适配器到Gson Gson gson = new GsonBuilder() .registerTypeAdapter(Network.class, new NetworkTypeAdapter()) .setPrettyPrinting() .create(); String nwkJsonString = gson.toJson(network); System.out.println("JSON String from POJO ==>\n" + nwkJsonString); Network netwrkOut = gson.fromJson(nwkJsonString, Network.class); System.out.println(netwrkOut.toPrettyString()); } }
这种方法需要手动处理每个字段,适合模型类字段较少的场景,如果字段较多会比较繁琐。
内容的提问来源于stack exchange,提问作者kishn
相关产品推荐
相关产品推荐

