使用google gson在hashmap中的json数组

时间:2014-01-09 07:47:27

标签: java json gson

我是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"}
]

3 个答案:

答案 0 :(得分:8)

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

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

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

编辑以添加以下评论:

如果你想反序列化为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);

答案 1 :(得分:0)

我假设您正在尝试创建countryId s到countryName s的映射,对吗?这可以在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<String, String>对象listOfCountry,这是一个令人困惑的名字 - 是地图还是列表?避免对非列表对象使用“list”之类的名称。在这种情况下,我会建议countriescountryMap

答案 2 :(得分:0)

在阅读@ 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并循环遍历以创建地图。