You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:55:28