【问题标题】:How to Deserialize unknown primitive json property type using Gson如何使用 Gson 反序列化未知的原始 json 属性类型
【发布时间】:2026-01-03 15:40:01
【问题描述】:

使用 Gson 反序列化简单 JSONObject(或 JSONArray)但“值”属性可以是整数、布尔值或字符串类型的最佳方法是什么

{"label":"Label", "value":56}
{"label":"Label", "value":false}
{"label":"Label", "value":"string value"}

public class ViewPair {
    @SerializedName("label")
    private String label;
    @SerializedName("value")
    private <Unknown> value;

按照 Deadpool 的建议,我尝试了 JsonPrimitive 类型,但每当我想从 ViewPair 获取值时都会出错,如下所示:

Gson gson=new Gson();
List<ViewPair>data = gson.fromJson(array.toString(), listType);
JSONObject object = item.getJSONObject("value");
String spinnerLabel=object.getString("label");
JsonPrimitive spinnerValue=(JsonPrimitive) object.get("value");<-error
Caused by: java.lang.ClassCastException: java.lang.Boolean cannot be cast to com.google.gson.JsonPrimitive

【问题讨论】:

    标签: java json gson deserialization


    【解决方案1】:

    您可以将其解析为JsonPrimitive,因为它具有检查类型isBooleanisNumberisString 的方法以及获取值的方法

    public class ViewPair {
    
       @SerializedName("label")
       private String label;
    
       @SerializedName("value")
       private JsonPrimitive value;
    
    }
    

    这是我测试这三个场景的示例

    ViewPair targetObject1 = new Gson().fromJson("{\"label\":\"Label\", \"value\":56}", ViewPair.class);
    ViewPair targetObject2 = new Gson().fromJson("{\"label\":\"Label\", \"value\":false}", ViewPair.class);
    ViewPair targetObject3 = new Gson().fromJson("{\"label\":\"Label\", \"value\":\"string value\"}", ViewPair.class);
    

    JsonObject你可以直接得到JsonPrimitive

    JsonPrimitive object = item.getAsJsonPrimitive("value");
    

    JsonPrimitive你可以得到所需类型的值

    object.getAsString()
    object.getAsInt()
    object.getAsBoolean()
    

    【讨论】:

    • 谢谢,但我收到错误 java.lang.ClassCastException: java.lang.String cannot be cast to com.google.gson.JsonPrimitive when JSONObject object = item.getJSONObject("value"); JsonPrimitive spinnerValue=(JsonPrimitive)object.get("value");
    • 你不应该进行类型转换,在JsonElement上使用getAsJsonPrimitive来获取原始类型javadoc.io/static/com.google.code.gson/gson/2.6.2/com/google/…,如果您有任何问题,请更新上面帖子@Taha中的错误消息代码/跨度>
    最近更新 更多