如何禁用从数字到字符串的 Gson 反序列化

How disable Gson deserilization from Number to String

我有class

class X {
String a;
String b;
}

我使用 gson 将字符串反序列化为对象 X:

new Gson().fromJson("{\"a\": 123, \"b\": 456}", X.class);

及其作品。我如何禁用 Num 到 String 的转换?我想得到例外。

您需要实现并注册自定义类型适配器:

class StrictStringTypeAdapter extends TypeAdapter<String> {
    @Override
    public String read(JsonReader in) throws IOException {
        JsonToken peek = in.peek();
        if (peek == JsonToken.NULL) {
            in.nextNull();
            return null;
        }

        if (peek != JsonToken.STRING) {
            throw new JsonParseException("Non-string token!");
        }
        return in.nextString();
    }

    @Override
    public void write(JsonWriter out, String value) throws IOException {
        out.value(value);
    }
}

您可以将其用作:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonParseException;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;

import java.io.IOException;

public class GsonApp {
    public static void main(String[] args) {
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(String.class, new StrictStringTypeAdapter())
                .create();
        X coordinates = gson.fromJson("{\"a\": 123, \"b\": 456}", X.class);
    }
}

以上代码打印:

Exception in thread "main" com.google.gson.JsonParseException: Non-string token!
    at com.example.StrictStringTypeAdapter.read(GsonApp.java:33)
    at com.example.StrictStringTypeAdapter.read(GsonApp.java:23)