Java 使用googlegson在hashmap中使用json数组

Java 使用googlegson在hashmap中使用json数组,java,json,gson,Java,Json,Gson,我是Gson新手,我正在尝试解析Hashmap中的对象数组,但我得到了com.google.Gson.JsonSyntaxException:java.lang.IllegalStateException:预期的BEGIN_数组,但在第1行第3列是BEGIN_对象 我的代码是 Map<String, String> listOfCountry = new HashMap<String, String>(); Gson gson = new Gson(); Type lis

我是Gson新手,我正在尝试解析
Hashmap
中的对象数组,但我得到了
com.google.Gson.JsonSyntaxException:java.lang.IllegalStateException:预期的BEGIN_数组,但在第1行第3列是BEGIN_对象

我的代码是

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是一个对象数组,与
HashMap
没有任何相似之处

如果您的意思是试图将其转换为
HashMap
s的
列表
。。。这就是你需要做的:

Gson gson = new Gson();
Type listType = new TypeToken<List<HashMap<String, String>>>(){}.getType();
List<HashMap<String, String>> listOfCountry = 
    gson.fromJson(sb.toString(), listType);
也就是说,最好使用
集合

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

我假设您正在尝试创建
countryId
s到
countryName
s的映射,对吗?这可以在Gson中完成,但实际上并不是它的设计目的。Gson主要用于将JSON转换为等效的Java对象(例如,将数组转换为列表、将对象转换为对象或映射等),而不是将任意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);
Type countryMapType=new-TypeToken(){}.getType();
Map countryMap=gson.fromJson(sb.toString(),countryMapType);

如果无法编辑JSON语法,则必须手动将JSON数据解析到您试图创建的结构中,这将有点繁琐和复杂。最好是在网上阅读,以了解如何使用


另一方面,你称你的
Map
对象
listOfCountry
,这是一个令人困惑的名字——它是地图还是列表?避免对非列表的对象使用“列表”之类的名称。在这种情况下,我建议在阅读@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);
Type Type=new-TypeToken(){}.getType();
Gson Gson=new GsonBuilder(){
@凌驾
公共HashMap反序列化(JsonElement JsonElement,类型类型,JsonDeserializationContext JsonDeserializationContext)引发JsonParseException{
HashMap=newHashMap();
for(JsonElement元素:JsonElement.getAsJsonArray()){
JsonObject JsonObject=element.getAsJsonObject();
signals.put(jsonObject.get(“countryId”).getAsString(),jsonObject.get(“countryName”).getAsString());
}
返回图;
}
}).create();
HashMap countries=gson.fromJson(jsonArray,类型);

但在这一点上,您可以将json解析为JsonArray,并在其中循环生成映射。

不,我只需要将所有数据放入hashmap。在一个hashmapWell中没有hashmap列表,因为您的JSON不是hashmap,您的数据也不是任何可以“放在hashmap中”的东西。。。那么,你的问题就毫无意义了。当我试图在国家/地区类数组中获取它时,所有字段都是空类型listType=new-TypeToken(){}.getType();country[]carray=gson.fromJson(sb.toString(),listType)“绝对没有意义”有点苛刻,您只需将键和值放在hashmap中即可。键countryId和countryName以及作为json字符串或对象的值。是的,创建一个pojo很好,但这可以作为一个中介。也许您可以提供一个您希望最终使用的映射结构的示例?首先,请访问json.org,花十分钟(仅此而已)学习json语法。
Type countryMapType = new TypeToken<Map<Integer,String>>(){}.getType();
Map<Integer,String> countryMap = gson.fromJson(sb.toString(), countryMapType);
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);