当前位置: 首页 > 知识库问答 >
问题:

用GSON将不同名称的字段反序列化为同一个字段

董建德
2023-03-14

我正在努力用本地化反序列化世界天气在线API结果。

 "hourly": [

           {

              "chanceoffog": "0",

              "chanceoffrost": "0",

              "chanceofhightemp": "0",

              "chanceofovercast": "63",

              "chanceofrain": "3",

              "chanceofremdry": "0",

              "chanceofsnow": "0",

              "chanceofsunshine": "0",

              "chanceofthunder": "0",

              "chanceofwindy": "0",

              "cloudcover": "88",

              "DewPointC": "1",

              "DewPointF": "34",

              "FeelsLikeC": "4",

              "FeelsLikeF": "39",

              "HeatIndexC": "7",

              "HeatIndexF": "44",

              "humidity": "67",

              "lang_ru": [

                 {

                    "value": "Пасмурно"

                 }

              ],

              "precipMM": "0.0",

              "pressure": "1033",

              "tempC": "7",

              "tempF": "44",

              "time": "24",

              "visibility": "10",

              "weatherCode": "122",

              "weatherDesc": [

                 {

                    "value": "Overcast"

                 }

              ],

              "weatherIconUrl": [

                 {

                    "value": "http://cdn.worldweatheronline.net/images/wsymbols01_png_64/wsymbol_0004_black_low_cloud.png"

                 }

              ],

              "WindChillC": "4",

              "WindChillF": "39",

              "winddir16Point": "WNW",

              "winddirDegree": "294",

              "WindGustKmph": "17",

              "WindGustMiles": "11",

              "windspeedKmph": "14",

              "windspeedMiles": "9"

           }

        ]

是否有更好、更简单的解决方案,只为lang对象编写一个自定义反序列化器,并允许GSON自动反序列化其余数据?

共有1个答案

施英哲
2023-03-14

我遇到了一个类似的问题,一个用户对象可以有id、userId或user_id,这就是我如何将这三个对象映射到id的方法。

public class UserDeserializer implements JsonDeserializer<User> {


@Override
public User deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {

    try {
        User user = new GsonBuilder().create().fromJson(json, User.class);
        if (user.id == null) {
            JsonObject jsonObject = json.getAsJsonObject();
            JsonElement userId = jsonObject.get("userid");

            if (userId != null) {
                user.id = userId.getAsString();
                return user;
            }
            JsonElement user_id = jsonObject.get("user_id");
            if (user_id != null) {
                user.id = user_id.getAsString();
                return user;
            }
        }
        return user;
    } catch (JsonParseException ex) {
        ex.printStackTrace();
        throw ex;
    }
}

}

 类似资料:
  • 首先,我想说这是一个大学项目。 我有三节课<代码>订单抽象类和从订单继承的和类。 我使用Gson序列化/反序列化子类,但我遇到了一点问题。订单类有一个字段,gson使用该字段来确定订单类型,DineIn或Delivery。 序列化工作得很好。问题是,每当我尝试反序列化时,类型字段值都不会读取,并且总是设置为null,即使它存在于JSON文件中。当有很多字段时,就会发生这种情况,因为当我尝试在较小的

  • 问题内容: 我今天在另一个问题中提出了这个问题,但是 由于措辞的方式,恐怕无法解决任何问题。 我有一个json输入,其中包含以下数据: 杰森 如您所见,option_value项是一个对象中的Array和 另一个对象中的简单字符串。 我怎样才能让Gson正确处理呢?我的类将此描述为 List对象,因此它适用于option_value是 数组的前几个项目,但是当它成为字符串时,应用程序崩溃,并且我收

  • 问题内容: 我有一个像这样的POJO,我正在使用GSON序列化为JSON: 这是我的做法: 现在我的json将是这样的: 现在我的问题是:有什么办法可以代替更改变量名呢?在Gson中,我可以在变量顶部使用任何注释吗? 我想要这样的东西: 问题答案: 您可以使用@SerializedName(“ client_id”) 编辑: 您也可以使用它,以通用方式更改所有字段

  • 我之前的问题没有得到任何结果,可能是我问得不对,或者太详细了。 现在我的基本问题是,如何将一个具有一个类名的JSON对象反序列化为一个具有不同类名的Java对象? 例如,服务器发送/期望的JSON类是“18”(我对此控制为零)。我的Java班不可能是“18”,所以是“_18”。 简单地执行new Gson().fromjson()没有任何帮助,即使使用了不同的命名策略;_18对象始终为NULL。从

  • 问题内容: 假设我们有这样的结构: JSON: 和对应的POJO: 响应类 身体类 CatWrapper.class 类别 但是现在让我们说,我们具有相同的结构,但是我们得到的不是 我在上使用GSON(默认json解析器),在提供解决方案时请考虑一下。 我们可以在此处使用泛型,因此响应如下所示: 但是我们不能,因为字段名称是特定于类的。 题: 我如何做才能自动序列化它而不创建太多样板类?我并不真的

  • 问题内容: Jackson json注释中以下jax-b注释的等效方式是什么? 我需要生成json而不是xml,并且需要了解在jax-b中等效表示的常规jackson批注。 重命名字段。 使用getter代替字段。 如果json / xml元素名称是Java保留字(例如“ ”,“ ”,“ ”等),则这些功能尤其重要。 因此我们必须将POJO字段分别命名为“ new ”,“ _ public ”,“