【问题标题】:json array in hashmap using google gson使用谷歌gson在hashmap中的json数组
【发布时间】:2014-01-09 07:47:27
【问题描述】:

我是 Gson 的新手,我正在尝试解析 Hashmap 中的对象数组,但我得到了 com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 3

我的代码是

Map<String, String> listOfCountry = new HashMap<String, String>();
Gson gson = new Gson();
Type listType = new TypeToken<HashMap<String, String>>() {}.getType();
listOfCountry = gson.fromJson(sb.toString(), listType);

JSON 是

[
  {"countryId":"1","countryName":"India"},
  {"countryId":"2","countryName":"United State"}
]

【问题讨论】:

  • 也许您可以提供一个您希望最终得到的 Map 结构的示例?
  • 首先访问 json.org 并花 10 分钟(全部时间)来学习 JSON 语法。

标签: java json gson


【解决方案1】:

您的 JSON 是一个对象数组,而不是类似于 HashMap 的任何东西。

如果您的意思是尝试将其转换为 ListHashMaps ... 那么这就是您需要做的:

Gson gson = new Gson();
Type listType = new TypeToken<List<HashMap<String, String>>>(){}.getType();
List<HashMap<String, String>> listOfCountry = 
    gson.fromJson(sb.toString(), listType);

编辑以从下面的 cmets 添加:

如果您想反序列化为 Country POJO 数组(这确实是更好的方法),那么简单如下:

class Country {
    public String countryId;
    public String countryName;
}
...
Country[] countryArray = gson.fromJson(myJsonString, Country[].class);

也就是说,使用Collection 确实更好:

Type listType = new TypeToken<List<Country>>(){}.getType();
List<Country> countryList = gson.fromJson(myJsonString, listType);

【讨论】:

  • 不,我只需要将所有数据放入哈希图中。不是单个哈希图中的哈希图列表
  • 当我尝试在国家类数组中获取它时,所有字段都为空 Type listType = new TypeToken() {}.getType(); country[] carray=gson.fromJson(sb.toString(), listType)
  • "abosultely no sense" 有点苛刻,您可以简单地将键和值放在哈希图中。键 countryId 和 countryName 以及值是 json 字符串或对象。是的,创建一个 pojo 很好,但这可以用作中介。 stackoverflow.com/a/14944513/106261
【解决方案2】:

我假设您正在尝试创建 countryIds 到 countryNames 的映射,对吗?这可以在 Gson 中完成,但实际上并不是它的设计目的。 Gson 主要用于将 JSON 转换为等效的 Java 对象(例如,将数组转换为 List,将对象转换为 Object 或 Map 等),而不是将任意 JSON 转换为任意 Java。

如果可能,您最好的办法是重构您的 JSON。考虑以下格式:

{
  "1": "India",
  "2": "United State"
}

它不那么冗长,更易于阅读,最值得注意的是,使用 Gson 易于解析:

Type countryMapType = new TypeToken<Map<Integer,String>>(){}.getType();
Map<Integer,String> countryMap = gson.fromJson(sb.toString(), countryMapType);

如果您无法编辑 JSON 语法,则必须手动将 JSON 数据解析为您尝试创建的结构,这会有些繁琐和复杂。最好阅读Gson User Guide 以了解如何操作。

顺便说一句,您将Map&lt;String, String&gt; 对象称为listOfCountry,这是一个令人困惑的名称- 它是地图还是列表?避免对非列表的对象使用“列表”之类的名称。在这种情况下,我建议countriescountryMap

【讨论】:

    【解决方案3】:

    在阅读了@dimo414 和@Brian Roach 所说的之后,如果您仍然想从您的 json 结构中获取地图,您可以通过这样做来实现:

    Type type = new TypeToken<HashMap<String, String>>() {}.getType();
    Gson gson = new GsonBuilder().registerTypeAdapter(type, new JsonDeserializer<HashMap<String, String>>() {
    
        @Override
        public HashMap<String, String> deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
            HashMap<String, String> map = new HashMap<>();
    
            for (JsonElement element : jsonElement.getAsJsonArray()) {
                JsonObject jsonObject = element.getAsJsonObject();
    
                signals.put(jsonObject.get("countryId").getAsString(), jsonObject.get("countryName").getAsString());
            }
    
            return map;
        }
    }).create();
    
    HashMap<String, String> countries = gson.fromJson(jsonArray, type);
    

    但那时你可以将你的 json 解析成一个 JsonArray 并循环遍历它来制作你的地图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多