Gson -字段名称相同,类型不同

cnjp1d6j  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(329)

我今天在另一个问题中问了这个问题,但我担心这不会得到任何解决,因为它的措辞。
我有一个json输入,其中包含以下数据:

如您所见,option_value项在一个对象中是Array,而在另一个对象中是简单的字符串。
我如何让Gson正确处理这个问题?我的类将其描述为List对象,所以它适用于option_value是数组的前几项,但当它变成 string 时,应用崩溃,我得到一个json解析异常
是否有解决方法?

更新

按要求添加我的类的相关部分:

public class Options
    {
        String product_option_id;
        String option_id;
        String name;
        String type;
        String required;
        List<OptionValue> option_value;

        // get set stuff here

        public class OptionValue
        {
            String product_option_value_id;
            String option_value_id;
            String name;
            String image;
            String price;
            String price_prefix;

            // get set stuff here
        }
    }
rmbxnbpk

rmbxnbpk1#

我有一个解决方案给你:)为此,我们应该使用一个自定义的反序列化器。

public class Options{

        @SerializedName ("product_option_id");
        String mProductOptionId;

        @SerializedName ("option_id");
        String mOptionId;

        @SerializedName ("name");
        String mName;

        @SerializedName ("type");
        String mType;

        @SerializedName ("required");
        String mRequired;

        //don't assign any serialized name, this field will be parsed manually
        List<OptionValue> mOptionValue;

        //setter
        public void setOptionValues(List<OptionValue> optionValues){
             mOptionValue = optionValues;
        }

        // get set stuff here
        public class OptionValue
        {
            String product_option_value_id;
            String option_value_id;
            String name;
            String image;
            String price;
            String price_prefix;

            // get set stuff here
        }

    public static class OptionsDeserializer implements JsonDeserializer<Options> {

        @Override
        public Offer deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            Options options = new Gson().fromJson(json, Options.class);
            JsonObject jsonObject = json.getAsJsonObject();

            if (jsonObject.has("option_value")) {
                JsonElement elem = jsonObject.get("option_value");
                if (elem != null && !elem.isJsonNull()) {  
                     String valuesString = elem.getAsString();
                     if (!TextUtils.isEmpty(valuesString)){
                         List<OptionValue> values = new Gson().fromJson(valuesString, new TypeToken<ArrayList<OptionValue>>() {}.getType());
                         options.setOptionValues(values);
                     }
                }
            }
            return options ;
        }
    }
    }

在让Gson解析json之前,我们应该注册我们的自定义反序列化器:

Gson gson = new GsonBuilder()              
                .registerTypeAdapter(Options.class, new Options.OptionsDeserilizer())               
                .create();

而现在--只需呼叫:

Options options = gson.fromJson(json, Options.class);
lc8prwob

lc8prwob2#

在我的情况下,具有相同名称的字段是“data”:{}或“data”:[array_with_真实的_data]。因此,来自已接受答案的代码需要稍微修改,如下所示:

@Override
public MyClass deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
        throws JsonParseException {
    MyClass bean = new Gson().fromJson(json, MyClass.class);
    JsonObject jsonObject = json.getAsJsonObject();

    if (jsonObject.has("data")) {
        JsonArray array = jsonObject.getAsJsonArray("data");
        if (array != null && !array.isJsonNull()) {
            List<Data> data = new Gson().fromJson(array, new TypeToken<ArrayList<Data>>() {}.getType());
            bean.realData = data;
        }
    }
    return bean ;
}

希望能有所帮助。

相关问题