当前位置: 首页 > 面试题库 >

如何使用Gson解码未知字段的JSON?

谢飞舟
2023-03-14
问题内容

我有与此类似的JSON:

{
  "unknown_field": {
    "field1": "str",
    "field2": "str",
    "field3": "str",
    "field4": "str",
    "field5": "str"
  }, ......
}

我创建了一些类来映射这个json

public class MyModel implements Serializable {
  private int id;
  private HashMap<String, Model1> models;

  // getters and setter for id and models here
}

而Model1类是仅包含String字段的简单类。

但这是行不通的。

编辑:JSON格式如下所示:

{
    "1145": {
        "cities_id": "1145",
        "city": "Nawanshahr",
        "city_path": "nawanshahr",
        "region_id": "53",
        "region_district_id": "381",
        "country_id": "0",
        "million": "0",
        "population": null,
        "region_name": "Punjab"
    },
    "1148": {
        "cities_id": "1148",
        "city": "Nimbahera",
        "city_path": "nimbahera",
        "region_id": "54",
        "region_district_id": "528",
        "country_id": "0",
        "million": "0",
        "population": null,
        "region_name": "Rajasthan"
    }, 
    ...
}

问题答案:

Gson 2.0+的解决方案
我刚刚了解到,使用更新的Gson版本,这非常简单:

GsonBuilder builder = new GsonBuilder();
Object o = builder.create().fromJson(json, Object.class);

创建的对象是一个Map(com.google.gson.internal.LinkedTreeMap),如果你打印它,它看起来像这样:

{1145={cities_id=1145, city=Nawanshahr, city_path=nawanshahr, region_id=53, region_district_id=381, country_id=0, million=0, population=null, region_name=Punjab}, 
 1148={cities_id=1148, city=Nimbahera, city_path=nimbahera, region_id=54, region_district_id=528, country_id=0, million=0, population=null, region_name=Rajasthan}
...

使用自定义解串器的解决方案
(注意:除非你坚持使用Gson 2.0之前的版本,否则你并不是真正的自定义反序列化器。但是了解如何在Gson中进行自定义反序列化(和序列化)仍然很有用,并且通常最佳方法,具体取决于你要如何使用解析后的数据。)

因此,我们确实在处理随机/可变字段名称。(当然,这种JSON格式不是很好;这种数据应放在JSON数组中,在这种情况下,可以很容易地将其读入List。哦,我们仍然可以解析它。)

首先,这是我如何在Java对象中对JSON数据建模:

// info for individual city
public class City    {
    String citiesId;
    String city;
    String regionName;
    // and so on
}

// top-level object, containing info for lots of cities
public class CityList  {
    List<City> cities;

    public CityList(List<City> cities) {
        this.cities = cities;
    }
}

然后,解析。处理此类JSON的一种方法是为顶级对象(CityList)创建自定义反序列化器。

像这样:

public class CityListDeserializer implements JsonDeserializer<CityList> {

    @Override
    public CityList deserialize(JsonElement element, Type type, JsonDeserializationContext context) throws JsonParseException {
        JsonObject jsonObject = element.getAsJsonObject();
        List<City> cities = new ArrayList<City>();
        for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
            // For individual City objects, we can use default deserialisation:
            City city = context.deserialize(entry.getValue(), City.class); 
            cities.add(city);
        }
        return new CityList(cities);
    }

}

需要注意的关键点是重新jsonObject.entrySet()调出所有顶级字段(名称如“ 1145”,“ 1148”等)的调用。这个堆栈溢出的答案帮助我解决了这个问题。

在下面完成解析代码。请注意,你需要使用registerTypeAdapter()注册自定义序列化程序。

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(CityList.class, new CityListDeserializer());
Gson gson = builder.setFieldNamingPolicy(LOWER_CASE_WITH_UNDERSCORES).create();
CityList list = gson.fromJson(json, CityList.class);


 类似资料:
  • 问题内容: 因此,我使用GSON来从API解析JSON,并被困在如何解析数据中的动态字段上。 这是查询返回的JSON数据的示例: 我当前处理单个静态值的方式是使用一个类: 然后我可以简单地使用GSON来解析它: 我知道这对子数据有效,因为我可以查询并获得单个条目并非常轻松地解析该条目,但是为数组中每个值给出的随机整数值呢?(即30655845和2868874) 有什么帮助吗? 问题答案: 根据GS

  • 问题内容: 我在这里分叉了一个很棒的项目,并且刚刚学习了一些东西,就把它弄乱了。我不知道的问题是有关自定义编组的一些问题,如果您在这里看到,您可以看到它解组了包含一个字段的结构,然后使用该字段将其解组。除了嵌套的情况,这一切都很好。因此,最好的例子是: 只需说您有一个善意的结构是a ,那么就可以将其编组。然后具有3个保留在字段中的类型。这些孩子最终成为我的问题类型。我如何才能解决嵌套数据的问题?这

  • 问题内容: 是否可以解组未知字段的JSON?该字段名称始终是不同的,但是结构是相同的。JSON是POST请求的结果。 我的代码: 问题答案: 如果您不知道键,只需使用一个映射,并且映射的值类型可能是描述该结构的结构: 请注意,您必须导出字段才能使用此功能! 和解编代码: 输出(在Go Playground 上尝试):

  • 我想在Android Studio中使用Gson库解析以下JSON数据。但是数据是通用的...不知道数据中有什么键(对象)... 在学校物体下——有1103号物体。 在这个物体下,我们有shoolname,shortname,students,同样在students下,有id,比如2201,2202。。。这些物体是动态的,不知道会有什么反应。。 所以问题是如何解析这个json字符串在Android

  • 我是JSON的新手,与我研究过的任何其他解析方法相比,我喜欢GSON Api的强大和直截了当。 我想解析一个相当复杂的JSON(使用GSON),就结构而言,它类似于下面的JSON: 我哪里出了问题? 是否有一种创建我所缺少的类的特殊方法? 注意:从结构的角度来看,我的JSON对象是完全有效的。如果您看到任何错误,这可能是因为当我手动创建上面的虚拟/演示时,它们出现了滑动。

  • 我在这里分叉了一个很棒的项目,并且一直在学习一些东西。我无法弄清楚的问题是关于自定义解编的一些事情,如果您看到这里,您可以看到这解封了包含字段的结构,然后使用字段解组。除了嵌套情况外,这一切都很好用。所以最好的事情是一个例子: 假设你有一个< code>Thing结构,它是一个< code>listing,也就是< code>Thing。数据这被解组为类型< code >列表。那么< code>l